我看到一對夫婦的問題在這裏。你對協議和類有誤解,你也有一個與協議接口的應用程序,雖然善意實際上讓你的生活比需要的更難。
你遇到的第一個問題是一些煩惱協議和類之間以及採用協議和從類繼承之間的區別。這很好,這個東西不容易。基本上,協議只是一個對象的接口,而一個類提供了一個接口和一個實現。換句話說,協議只是一個可以調用的方法列表,而一個類既是方法列表,也是執行這些方法的代碼。爲了得到更完整的解釋,或許你會更好地直接找到源代碼 - 蘋果公司的"The Objective-C Programming Language"可能會幫助你,所以請閱讀有關課程和協議。我認爲這樣做會讓你明白爲什麼你沒有成功地給你的id<SetSectionController>
實例一個navigationController
屬性,而沒有明確定義它。但是,如果您之後對此有任何具體問題,請告訴我。
難以修復的問題是SetSectionController
協議。它有幾個問題並且描述它們都不在這個答案的範圍之內。這是事情 - 實現基本上需要實現此協議的對象知道哪個導航控制器與表視圖關聯。這已經提供deus ex machina通過將它們耦合到應用程序的代表,你是正確的,以消除這種耦合。但是現在您必須找到另一種方法來將正確的數據填充到視圖控制器中,以將其推入導航堆棧。
我認爲您應該將推送邏輯移入視圖控制器,並且現在讓部分控制器提供一個接口,以便爲視圖控制器提供所需的信息。所以說,部分控制器具有這樣的僞代碼實現:
- (void)...didSelectRow...
{
id detailsForIndexPath = self.dataForRows[indexPath.row];
DetailViewController *vc = [DetailViewController new];
vc.details = detailsForIndexPath;
[APPDELEGATE.navigationController push:vc];
}
然後我會添加一個方法來SetSectionController
稱爲像-dataForRow:
,它的實施將像上面的方法的第一行。然後,在您的視圖控制器,實現...didSelectRow...
這樣的:
- (void)...didSelectRow...
{
id<SetSectionController> sc = self.sectionControllers[indexPath.section];
id details = [sc dataForRow:indexPath.row];
DetailViewController *vc = [DetailViewController new];
vc.details = details;
[self.navigationController push:vc];
}
如果部分控制器做別的有用的...didSelectRow...
確保要麼將其移動到視圖控制器或到區間控制器轉發...didSelectRow...
現在。
儘管我很欣賞試圖通過多態來更容易地管理複雜的表格部分,但此協議並不是正確的方式。它盲目地複製了UITableViewDelegate
和UITableViewDataSource
中的方法,而沒有考慮這些問題是否是要求對單個表格的單個部分負責的正確問題。如果你仍然想使用它,我認爲需要進行一些重要的重構才能使它變成一種實際上讓你的生活更輕鬆而不難的形狀。根據每節邏輯偏差的複雜性,我可能會完全放棄它。但這真是一個完整的其他問題。希望這可以幫助!
您的項目是否有UINavigationController? –
是的和一個tabbarcontroller。這些類旨在使其更清潔以生成表格視圖。 – Jules
爲什麼不使用'UITableViewDelegate'而不是'SetsSectionController'? 你是什麼意思 「將SetsObject控件從NSObject更改爲UIViewController不可用」? 'SetsStyleSectionController'是否有一個名爲'navigationController'的屬性? –