我的根控制器是一個帶有靜態單元和導航控制器的TableViewController。 取決於選擇哪個單元格,我想推入另一個ViewController(帶有嵌入的TableView),它將相應地更改其配置(啓用或不啓用按鈕,來自db表或NSArray的單元格數據等)。 選擇一些「控制器A」單元將調用「控制器B」或「控制器C」並傳遞一些數據。在視圖控制器之間移動並傳遞數據的正確方法
的代碼我想看起來像這樣:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
switch (indexPath.row) {
case 0:
{
[self performSegueWithIdentifier:@"segueToType" sender:self];
}
break;
case 1:
{
[self performSegueWithIdentifier:@"segueToType" sender:self];
}
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"segueToType"])
{
NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow];
NSInteger rowNumber = selectedIndexPath.row;
switch (rowNumber) {
case 0:
{
TypeSelectController *selCon = [segue destinationViewController];
selCon.myPet = self.myPet;
selCon.sel = @"tipo";
selCon.delegate = self;
}
break;
case 1:
{
TypeSelectController *selCon = [segue destinationViewController];
selCon.myPet = self.myPet;
selCon.sel = @"razza";
selCon.delegate = self;
}
break;
default:
break;
}
}
}
在這種情況下,例如,我只調用「控制器B」,但根據的「控制器A」選中單元格上它以不同的方式配置自己(取決於「selCon.sel」字符串)。
在「控制器B」,我有這樣的代碼:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([sel isEqualToString:@"tipo"]) {
NSString *itemToPassBack = [tipi objectAtIndex:indexPath.row];
[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack ofType:@"tipo"];
[self.navigationController popViewControllerAnimated:YES];
} else if ([sel isEqualToString:@"razza"]) {
NSString *itemToPassBack = [razze objectAtIndex:indexPath.row];
[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack ofType:@"razza"];
[self.navigationController popViewControllerAnimated:YES];
}
}
如此反覆,這取決於字符串「SEL」值,我返回不同的數據,「控制器A」。
當我選擇控制器A中的第一個單元格時,我正確得到了控制器B的場景。然後我選擇一個單元並返回到控制器A並輸入正確的數據。 現在,如果我嘗試選擇控制器A的第二個單元格,選擇在控制器B細胞,導航不迴應,因爲我想和我得到的控制器C情景,那麼控制器A和以下錯誤:
嵌套的推動動畫可能導致導航欄損壞
完成處於意外狀態的導航轉換。導航欄子視圖樹可能會損壞。
不平衡呼叫開始/結束外觀轉換。
我在做什麼錯?
我不確定是否有足夠的代碼來幫助您。你有什麼好看的,除了你在用這行做什麼:[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack ofType:@「razza」];我不明白在addItemViewController委託調用中傳遞自己。你是否注入到視圖控制器或導航流? – CocoaEv 2012-08-05 17:15:32
這是使用委託方法將數據傳回控制器A所需的代碼的一部分。我用這個鏈接顯示的代碼:http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers – Aleph72 2012-08-05 17:25:57
這個例子在理論上是好的,但當你使用故事板和segues時不適合。你需要做什麼「物品回傳?」 - 特別是在使用協議和委託時,您通常會設置一個屬性或將屬性傳遞給原始vc。我會爲你寫一個答案。 – CocoaEv 2012-08-05 17:38:14