5

Xcode 4.6.1 iOS 6 使用情节提要

我的问题是这个

我在 UIViewController 中的 UIView 上有一个带有动态原型单元格的 UITableView(它本身嵌入在导航控制器中),我想从一个特定的单元格到另一个视图

(在有人建议我应该只使用 UITableViewController 之前,我确实在 UIView 上有其他东西,所以我设置这种方式是有原因的。)

现在我不确定如何创建 segue

如果我从原型 UITableViewCell 拖动来创建一个 segue ,所有生成的单元格都会自动调用 segue - 当我只需要一个这样做时。这是正常行为,如果我使用 UITableViewController 通过从 UITableViewController 拖动并调用 [self performSegueWithIdentifier:.... .

在这种情况下,我没有 UITableViewController - 只是 UIView 上的 UITableView,它是 UIViewController 子类的一部分

我一直在玩,我刚刚发现我不能从 UITableView 拖动 - 不允许你这样做,所以这是一个死胡同。

我唯一的选择似乎是从 UIViewController 拖动

所以我尝试了,当然 XCode 在执行 segue 行上抛出一个错误,告诉我我有......“LocationTV”没有可见界面声明选择器 performSegueWithIdentifier。LocationTv 是我的 tableview 子类。

在这种情况下尝试调用新视图的正确方法是什么

谢谢

西蒙

4

3 回答 3

5

首先segues只能在 之间使用UIViewControllers。因此,如果您想在同一视图控制器上的两个视图之间执行转场,那是不可能的。

但是,如果您想在两个视图控制器之间执行转场,并且转场应该由一个视图(在第一个视图控制器内部)的动作触发,那么这是可能的。

因此,在您的情况下,如果我理解这个问题,您希望在UIView点击自定义内部的 UITableView 的第一个单元格时执行 segue。最简单的方法是在您的自定义上创建一个委托,该委托UIView将由您的 UIViewController 实现,其中包含自定义UIView,当调用委托方法时您应该执行 segue,这是一个简短的示例:

YourCustomView.h

@protocol YourCustomViewDelegate <NSObject>

-(void)pleasePerformSegueRightNow;

@end

@interface YourCustomView : UIView {
   UITableView *theTableView; //Maybe this is a IBOutlet
}
@property(weak, nonatomic) id<YourCustomViewDelegate>delegate;

YourCustomview.m

@implementation YourCustomview
@ synthesise delegate;

//make sure that your table view delegate/data source are set properly
//other methods here maybe

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row == 0) {  //or any other row if you want
       if([self.delegate respondsToSelector:@selector(pleasePerformSegueRightNow)]) {
          [self.delegate pleasePerformSegueRightNow];
       }
    }
} 

你的TableViewController.h

@interface YourTableViewController : UIViewController <YourCustomViewDelegate> {
  //instance variables, outlets and other stuff here
}

你的TableViewController.m

@implementation YourTableViewController

-(void)viewDidLoad {
  [super viewDidLoad]; 
  YourCustomView *customView = alloc init....
  customView.delegate = self;
}

-(void)pleasePerformSegue {
  [self performSegueWithIdentifier:@"YourSegueIdentifier"];
}

您可以为您的委托创建任何方法,也可以自定义行为,这只是一个简单的示例,说明如何做到这一点。

于 2013-06-14T07:54:10.870 回答
3

我的解决方案

我最终使用了委托模式

我做了一个从我的 UIViewController 拖动的 segue - 特别是从 viewController 图标(带有白色方块的橙色圆圈 - 从故事板视图下方的名称栏 - 尽管你也可以从侧边栏拖动)到我想继续的观点。

我需要从表格视图上的表格视图单元格触发此 segue。

表视图位

所以我在我的 tableview 头文件中声明了一个协议 - 称为 LocationTV.h - 如下

@protocol LocationTVSegueProtocol <NSObject>

-(void) makeItSegue:(id)sender;

@end

在此之下,我声明了一个属性来持有我的代表

@property (nonatomic, strong) id<LocationTVSegueProtocol> makeSegueDelegate;

为了真正触发 segue,我在 didSelectRowAtIndexPath 方法中调用了 makeSequeDelegate 上的 makeItSegueMethod

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

switch (indexPath.section) {
        DLog(@"selected row %d",indexPath.row);
    case dLocation:
    {
        if(indexPath.row == 2){

            [_makeSegueDelegate makeItSegue:self];

        } else if (indexPath.row == 7){

UIViewController 位

并将我的 UIViewController(名为 MultiTableHoldingVC)设置为实现该协议

@interface MultiTableHoldingView : UIViewController    
                                  <EnviroTVProtocol,LocationTVSegueProtocol> {

}

下面我在我的类方法列表中声明了协议方法(尽管我不确定这是必要的,因为编译器应该知道该方法,因为实现协议的声明本质上是实现此方法的承诺)

-(void) makeItSegue:(id)sender;

然后在我的 UIViewController 的实现文件中,我编写了基本上只是调用 preformSegueWithIdentifier 的方法

-(void) makeItSegue:(id)sender{ 
    [self performSegueWithIdentifier:@"ChooseCountryNow" 
                              sender:sender];   
}

并将它们链接在一起,就像在头文件中一样,我声明了我的 tableView 实例,如下所示

@property (strong, nonatomic) IBOutlet LocationTV *dsLocationTV;

我必须将表视图委托属性设置为 self - 我在 UIViewControllers -(void)ViewDidLoad 方法中所做的

_dsLocationTV.makeSegueDelegate = self;

调用方法来调用方法似乎有点杂乱无章,而且 allprog 建议更简单(我一生都无法弄清楚为什么它会为我抛出错误),但这很好用。感谢 allprog 和 danypata 的建议。

希望这对那里的人有帮助

于 2013-06-19T09:41:44.440 回答
0

performSegueWithIdentifier:是 UIViewController 类的一个方法。您不能在 UITableView 实例上调用它。让您的视图控制器实现 UITableViewDelegate 协议并将其设置为 UITableView 的委托。

另一种选择是你不使用segues。在同一个委托方法中:

OtherViewController ov = [[OtherViewController alloc] init<<some initializer>>];
// Or in case of storyboard:
OtherViewController ov = [self.storyboard instantiateViewControllerWithIdentifier:@"ovidentifier"];

// push view controller
[self.navigationController pushViewController:ov animated:YES];

如果委托对象与视图控制器不同,那么最简单的解决方案是在委托的类中添加一个弱属性,以保持对 viewController 的引用,如下所示:

@property (weak) UIViewController *viewController;

viewDidLoad在 viewController 中进行设置

- (void) viewDidLoad {
    self.tableView1.viewController = self;
}

确保该tableView1属性是这样声明的:

@property (IBACTION) (weak) SpecialTableView *tableView1;

有时使用故事板比自己编写代码更痛苦。

于 2013-06-14T07:52:46.400 回答