2016-03-15 38 views
2

我正在寫一個基本的iOS日曆應用程序使用swift。目前,我的主視圖包含一個子視圖 - 「月視圖」 - 其中包含五個「周視圖」,每個視圖包含7個「日視圖」。主視圖控制器被設置爲每個子視圖的代表,每個子視圖都可以被觸摸以觸發一個新的「日視圖控制器」,該日曆控制器加載所選日期的所有信息。日視圖控制器還在頂部導航欄上有一個按鈕「完成」按鈕,該按鈕觸發退回到主視圖控制器。迅速子視圖不更新後放鬆segue

問題是:在展開segue之後,day視圖控制器中「day」的數據成功傳遞迴主視圖控制器(我從調試我的數據模型中知道這一點),但是視圖主視圖控制器不會更新以正確顯示來自更新日期的信息。

我曾嘗試在segue上調用「setNeedsDisplay」和「setNeedsLayout」,並在主「月視圖」以及每個單獨的「日視圖」上調用「viewWillAppear」和「viewDidAppear」,但沒有更新。我也嘗試刪除和添加每個單獨的一天子視圖(只是爲了得到某些事情發生),但這導致新的一天與正確的信息疊加在舊的一天。我已經全面搜索瞭解決方案。我相信我可能會錯過一些快速的設計原則。非常感謝您提前!

下面是SEGUE代碼:

@IBAction func unwindToCalendar(sender: UIStoryboardSegue) { 
    if let sourceViewController = sender.sourceViewController as? dayUIViewController { 
     var tag = sourceViewController.tag 
     let dayOfWeek = tag%10 
     tag=tag/10 
     let weekOfMonth = tag%10 

     monthView.weekList[weekOfMonth].dayList[dayOfWeek] = sourceViewController.day 
     //monthView.weekList[weekOfMonth].dayList[dayOfWeek].updateLabel() 
     monthView.weekList[weekOfMonth].dayList[dayOfWeek].setNeedsDisplay() 
    } 
} 

更新:更新天子視圖的相關屬性 給了我想要的效果(即當我轉換回日曆視圖,選擇日反映了我從日視圖控制器所做的更改)。

所以更換此:

monthView.weekList[weekOfMonth].dayList[dayOfWeek] = sourceViewController.day 

與此:

monthView.weekList[weekOfMonth].dayList[dayOfWeek].dayOfMonth = sourceViewController.day.dayOfMonth 
monthView.weekList[weekOfMonth].dayList[dayOfWeek].updateLabel() 

得到所需的 「視覺」 的結果。但爲什麼用新的日視圖替換整個日視圖也不能達到這個結果呢?

+0

什麼_is_'monthView.weekList [weekOfMonth] .dayList [dayOfWeek)'?它看起來像某種_data_,而不是_view_。 – matt

+0

月視圖有一個包含星期子視圖數組的屬性,而星期子視圖具有天子視圖的類似屬性(在添加到此數組之前,所有這些子視圖都作爲子視圖添加到其父視圖中)。我這樣設置,這樣我就可以通過數組索引更輕鬆地訪問日視圖。 – killian95

+0

這裏有一個建議:你是否看到過,是否有任何瘋狂的機會,這一切都發生在後臺線程上?任何時候在更新界面時都會有一些不負責任的延遲,但我發現它通常是由於偶然嘗試從主線程更新界面而導致的。 – matt

回答

0

問題來自於「日間數據」和視圖本身存在於兩個不同的地方,我忽略了這一事實。在我最初的代碼中,我用新的「日視圖」替換了相關的數組條目,但日曆視圖中的相關子視圖仍然是舊的「日視圖」。我需要從SEGUE替換爲新的「日視圖」日曆天子視圖:

//make life easier with a variable 
let thisWeek = monthView.weekList[weekOfMonth] 

//remove the old subview from the calendar 
thisWeek.dayList[dayOfWeek].removeFromSuperview() 

//replace the old day with the new day in the data 
thisWeek.dayList[dayOfWeek] = sourceViewController.day 

//add the new day as a subview to its "week parent view" 
thisWeek.addSubview(thisWeek.dayList[dayOfWeek]) 

//nicely layout the new day subviews 
thisWeek.layoutSubviews() 

雖然我已經解決這方面的問題,我仍然在設計原則歡迎大家提出意見,因爲我是相當新的迅速和MVC設計。謝謝!