2016-11-15 20 views
0

我已經實現了一個UIPageViewController,允許用戶添加/刪除/刪除通過一個單獨的UITableView新的「頁面」,類似於蘋果如何實現在iPhone城市/旅遊地點天氣應用。項目發佈如下。目前沒有天氣或者花哨的用戶界面 - 我只是試圖關注下面的UIPageViewController管理。我們希望,如果有人想知道如何使用網頁執行UIPageViewController通過UITableView的管理,這是有用的: https://github.com/gallaugher/PageViewControllerDemo檢查方法:使用的UITableView細胞管理UIPageViewController頁面數據

這似乎很好地工作,但我是新來的這&相當不確定的,如果我用這個方法推薦或者做這是「Swifty」。

enter image description here

現在我有: PageViewController [初始視圖控制器] - 設置委託&數據源自我 - 實例化第一的UIViewController(想象一下當地的天氣CityViewController,即使不添加細節& UI在這個例子中)&設置初始值。城市(天氣位置)保存在[String]數組中:城市陣列

在CityViewController中 - 在右下角(在界面構建器中創建)中單擊「城市」按鈕時,它將打開一個UITableView (CityListViewController)。
- 爲了得到這個CityListViewController,我觸發了一個直接通過界面生成器從CityViewController中的「城市」按鈕繪製到城市列表控制器,以模態方式呈現的Segue。 - preapareForSegue將citiesArray傳遞給目標CityListViewController(UITableView)。

在CityListViewController(在UITableView的) - 用戶可以添加城市,移動,刪除的UITableView更新的tableView &陣列 - 點擊一個的tableView行(一個城市的名稱或「本地天氣」)觸發執行SEGUE,放卷CityViewController ,獲取源碼CityListViewController並使用它將數據傳回CityViewController(例如citiesArray = controller.citiesArray)。 - 這個@IBAction unwind函數調用一個展開到PageViewController(實際上不過是將數據從CityListViewController中的TableView傳遞到UIPageViewController PageViewController)。

放鬆在PageViewController - 抓鬥源(如CityViewController) - 通過密鑰數據後面(例如citiesArray = controller.citiesArray) - ,調用一個函數來實例視圖控制器爲當前&網頁集的PageControl指數等

Q1: 雖然這似乎工作&我沒有設法在測試過程中打破它,這是一個合理的方法,從UITableView,展開到一個ViewController,只是觸發另一個展開到UIPageViewController,沒有做任何事情比通過數據傳遞?

Q2: 我已經通過在PageViewController中以編程方式構建UIPageControl,但使用Interface Builder在城市視圖控件中創建了CityListViewController按鈕(UITableView)。這是正確的方法嗎?我似乎無法在同一個VC中創建這兩個。

非常感謝那些誰有耐心通過這個令人費解的解釋涉水。仍嘗試獲取VC之間傳遞數據的句柄,以及這與TableViews的PageControllers相關。

回答

0

爲了這個興趣,我發佈到GitHub上的解決方案: https://github.com/gallaugher/PageViewControllerDemo 我已與更多的通用名稱 - PageVewController,DetailViewController和ListViewController,所以這是更容易重用,也許隨之而來。

感謝Sazan Dauti在StackOverflow之外回答這個問題。可以在包含TableView的ListController之間直接切換,該列表用於管理頁面和類似頁面的數組(例如,Apple在Weather應用中可以添加/刪除/移動城市),將Detail(Cities in)原始的例子)沒有任何知識,它是在一個PageView。 - 將一個segue從UIPageViewController直接拖到帶有TableView的UIViewController,在我的情況下,它包含一個位置列表(而不是由PageView管理的詳細信息)。 segue應該以模態方式呈現。關鍵變量應該傳遞給ListViewController在賽格瑞一個準備在PageViewController這樣的:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
if segue.identifier == "ToListViewController" { 
    let controller = segue.destination as! ListViewController 
    controller.listArray = listArray 
    controller.currentPage = currentPage 
} 
} 
  • 務必通過(listArray &當前頁以上的情況下)的值在ListViewController聲明。

  • 添加開卷方法將PageViewController類似於:

    @IBAction FUNC unwindFromListViewController(發件人:UIStoryboardSegue){ pageControl.numberOfPages = listArray.count pageControl.currentPage =當前頁 setViewControllers([createDetailViewController(當前頁)],方向:的.forward,動畫:假,完成:無) }

以上setViewControllers指寫在第功能包含用於實例化當前頁面的DetailViewController的邏輯的PageViewController。

  • 返回賽格瑞是在ListView從TableViewCell拖動到「退出」按鈕(最右邊這個UIViewController中的頂/標題視圖三個按鈕)創建的。你會被詢問姓名對於應該放在PageViewController中的展開方法(在上面的示例中,我稱它爲unwindFromListViewController),因此請務必在嘗試製作網格之前添加此方法。

  • 爲segue函數添加一個準備ListViewController:

    override func prepare(for segue:UIStoryboardSegue,sender:Any?){ if segue.identifier ==「ToPageViewController」{controller} = segue.destination as! PageViewController controller.currentPage =當前頁 controller.listArray = listArray } }

  • 和的tableView didSelectRowAt,觸發執行SEGUE:

    FUNC的tableView(_的tableView:UITableView的,didSelectRowAt indexPath:IndexPath){ currentPage = indexPath。行//設置當前頁面行選擇 performSegue(withIdentifier:「ToPageViewController」,發件人:個體經營) }

我無法找到任何像樣的例子在線演示這是如何實現的,所以希望這是可理解和高效。任何更正都是值得歡迎的。乾杯!