UITableViewCell中的UINavigationController

时间:2013-08-17 18:32:50

标签: ios uinavigationcontroller mkmapview uitableview

我创建了一个带有属性的自定义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内的按钮时,导航控制器正常按下MyViewControllerMyViewController内部有一个MKMapView带有注释,viewDidAppar MyViewController [_mapView selectAnnotation:myAnnotation]已调用,但标注(弹出窗口)没有节目。如果我按下注释,则标注也不会显示。

为什么?

如果我更改CustomCell的构造函数/属性并传递目标/选择器而不是UINavigationController,并在viewMapAction内而不是在我的UITableViewController内创建CustomCell {{1}},地图标注正常显示。但是我会将所有细胞行动集中在细胞类中。

1 个答案:

答案 0 :(得分:0)

将所有细胞动作集中在细胞类中 - 这听起来不是一个好主意。请记住,表视图单元格是视图,因此通过MVC模式,它们只是用户的界面。控制器应该处理视图中的操作,例如推送其他控制器。 (根据我的经验,视图通常不知道它们的控制器是否存在。)让当前视图控制器负责推动其他视图控制器更有意义,对吗?

因此,如果您想要一个设计友好的解决方案,请让您的表视图控制器在cellForRowAtIndexPath中将单元格出列。单元类可以在构造函数方法中执行单元格的所有其他初始化。但重点是,单元格不必知道任何视图控制器。然后,使表视图控制器成为单元的委托(您必须创建此委托),并添加委托方法以在按下地图按钮时处理推送新的视图控制器。

如果您担心可重用性,这种方法应该对您有好处。只需在需要这样的表的地方插入表视图控制器子类。或者,创建一个实现此功能的UITableViewController的子类,然后为您需要呈现这些单元格的每种情况进一​​步为此类创建子类。

我知道这不是解决你的地图标注问题的方法,但我认为你会发现,通过更好的计划类结构,你可以完全避免这些模糊的问题。希望这有帮助!