我创建了一个带有属性的自定义UITabelViewCell:
@property (nonatomic, strong) UINavigationController *navigationController;
Synthethized:
@syntethized navigationController = _navigationController
“构造器”:
+ (CustomCell *)cellForTableView:(UITableView *)tableView navigationController:(UINavigationController *)navigationController {
CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:kCustomCellIdentifier];
if(cell == nil) {
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"AddressCell" owner:self options:nil];
for (id currentObject in topLevelObjects)
if ([currentObject isKindOfClass:[UITableViewCell class]]) {
cell = (CustomCell *) currentObject;
break;
}
}
cell.navigationController = navigationController;
return cell;
}
使用方法:
- (IBAction)viewMapAction:(id)sender {
MyViewController *controller = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
[_navigationController pushViewController:controller animated:YES];
}
当我按下CustomCell
内的按钮时,导航控制器正常按下MyViewController
。 MyViewController
内部有一个MKMapView
带有注释,viewDidAppar
MyViewController
[_mapView selectAnnotation:myAnnotation]
已调用,但标注(弹出窗口)没有节目。如果我按下注释,则标注也不会显示。
为什么?
如果我更改CustomCell
的构造函数/属性并传递目标/选择器而不是UINavigationController
,并在viewMapAction
内而不是在我的UITableViewController
内创建CustomCell
{{1}},地图标注正常显示。但是我会将所有细胞行动集中在细胞类中。
答案 0 :(得分:0)
将所有细胞动作集中在细胞类中 - 这听起来不是一个好主意。请记住,表视图单元格是视图,因此通过MVC模式,它们只是用户的界面。控制器应该处理视图中的操作,例如推送其他控制器。 (根据我的经验,视图通常不知道它们的控制器是否存在。)让当前视图控制器负责推动其他视图控制器更有意义,对吗?
因此,如果您想要一个设计友好的解决方案,请让您的表视图控制器在cellForRowAtIndexPath
中将单元格出列。单元类可以在构造函数方法中执行单元格的所有其他初始化。但重点是,单元格不必知道任何视图控制器。然后,使表视图控制器成为单元的委托(您必须创建此委托),并添加委托方法以在按下地图按钮时处理推送新的视图控制器。
如果您担心可重用性,这种方法应该对您有好处。只需在需要这样的表的地方插入表视图控制器子类。或者,创建一个实现此功能的UITableViewController
的子类,然后为您需要呈现这些单元格的每种情况进一步为此类创建子类。
我知道这不是解决你的地图标注问题的方法,但我认为你会发现,通过更好的计划类结构,你可以完全避免这些模糊的问题。希望这有帮助!