問題描述: VC的xib中有一個UITabelView, vc的.m文件設置tableView的SectionHeader .
自定義的Header和vc的view放在一個xib文件中, 加載view的時候出現(xiàn)死循環(huán)
// 無限調(diào)用, 引發(fā)死循環(huán)
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
ZTLLog(@"%@",self.view);
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil];
// 在這里通過 instantiateWithOwner:nil 加載view
OrderHeader *view = [nib instantiateWithOwner:nil options:nil][1];
return _testV;
}
一開始想不通問題出在哪里, 各種搜索引擎搜索過也沒有發(fā)現(xiàn)類似的情況, 大概沒有很多人喜歡把好多view放在一個xib文件中(其實省文件沒什么必要)
后來查詢文檔發(fā)現(xiàn)這么一句話
在調(diào)用完
instantiateWithOwner
方法后, self.view
的值會由新的view覆蓋掉.這就很有意思了, view中有tableView, tableView調(diào)用viewForHeaderInSection,
然后self.view又被重新賦值, 接著也就引發(fā)了死循環(huán).
秉著發(fā)現(xiàn)問題就要解決問題的原則(其實就是想折騰一下), 我想到了既然使用instantiateWithOwner:options:會自行改變self.view的指向, 那么我只調(diào)用一次不就好了嗎? 于是我吧代碼改成了在viewDidLoad
中調(diào)用一次instantiateWithOwner:options:
, 并且用一個數(shù)組把instantiateWithOwner:options:
的返回值存起來供調(diào)用的方式
- (void)viewDidLoad {
[super viewDidLoad];
UINib *nib = [UINib nibWithNibName:NSStringFromClass([self class]) bundle:nil];
_views = [NSArray arrayWithArray:[nib instantiateWithOwner:self options:nil]];
ZTLLog(@"self.view ---new%@",self.view);
[self addTableView];
}
在這之后再通過代碼的方式添加TableVIew的形式.結(jié)果項目是可以運行了, 但是又出現(xiàn)了新問題.
// 我在 viewForHeaderInSection 中通過調(diào)用
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
OrderHeader *view = self.views[1];
ZTLLog(@"OrderHeader%@",view);
return view;
}
因為self.nib值是不變的, 那么我返回的view一直也就是那么一個, 那么一個tableView刷下來就只有最后一個section會有header了, 這情況著實尷尬. 但是這樣的情況也讓我發(fā)現(xiàn), 如果不是那種需要復用的view, 比如登錄頁面要彈點動畫出來等等, 又不想用代碼來, 就可以用這樣的方式, 也算是加快開發(fā)進度了.
最后我選擇了把class也寫在vc中, 然后另起xib的文件來放header和footer.
其實這個問題的解決方法很多, 另外寫xib, 或者直接在tableView:viewForFooterInSection:
中寫樣式什么都是可以的, 相對來說是比較初級的問題, 寫這篇博客也是發(fā)現(xiàn)這個問題有點好玩, 順便記錄一下發(fā)現(xiàn)的問題
另外還有l(wèi)oadNibNamed:owner:也會造成類似的問題