代码之家  ›  专栏  ›  技术社区  ›  Jesse Bunch

在子视图中使用UITableView时无法识别的选择器

  •  2
  • Jesse Bunch  · 技术社区  · 14 年前

    我正在构建一个使用TabbarController显示其他几个视图的应用程序。在其中一个视图中,我使用导航控制器来导航一些表格数据。当用户单击此选项卡时,我将加载导航控制器,该控制器反过来加载我正在使用的表视图。问题是我在加载TableView控制器时得到以下错误:

    -[uiviewcontroller tableview:numberofrowspeagon:]:无法识别的选择器发送到实例0x6B37B10
    < /代码> 
    
    

    我在任何地方都读过,这种类型的错误通常来自于ib中的错误连接,或者视图控制器中的类不正确。这是我的代码和ib的屏幕截图,帮助我调试它。

    事先谢谢!

    我收到的错误

    ib中的TableView连接

    文件所有者的类 我的接口文件

    @interface faqlistviewcontroller:uiviewcontroller<uitableviewdatasource,uitableviewdelegate>。{
    
    //将保存FAQ键/值的字典
    NSmutablialeray*arrfaqdata;
    
    }
    < /代码> 
    
    

    实施

    实现faqlistviewcontroller //实现UITableView NumberOfRowsPreagon协议 -(nsinteger)tableview:(uitableview*)tableview numberofrowspeagon:(nsinteger)节{ 返回[arrfaqdata count]; } //UITableView CellForRowatindexPath协议的实现 -(UITableViewCell*)TableView:(UITableView*)TableView CellForRowaTindexPath:(nsIndexPath*)索引路径{ //查看是否有可重用的单元格 uiTableViewCell*objCell=[表视图DequeueRusableCellWithIdentifier:@“FaqCell”]; 如果(objcell==nil){ //不存在可重用的单元格,因此我们创建一个新的单元格 objcell=[[uiTableViewCell alloc]initWithStyle:uiTableViewCellStyleDefault ReuseIdentifier:@“faqCell”]; } /给它数据 nsdictionary*objrow=[arrfaqdata objectatindex:[indexpath row]]; objcell.textLabel.text=[objrow valueforkey:@“标题”]; //返回创建的单元格 返回对象; } //选择事件处理程序 -(void)tableview:(uitableview*)tableview didselectrowatindexpath:(nsindxpath*)indexpath{ //获取所选键的值 nsdictionary*dictrow=[arrfaqdata objectatindex:[indexpath row]]; nsstring*strurl=[dictrow valueforkey:@“url”]; /报警结果 uiAlertView*对象; objalert=[[uiAlertView alloc]initWithTitle:@“警报”消息:strurl delegate:nil cancelButtonTitle:@“确定”otherButtonTitles:nil]; //释放创建的对象 [objalert秀]; [objalert释放]; /取消选择行 [表视图取消选择行索引路径:indexpath动画:是]; } -(空)视图加载{ //从plist拉入常见问题解答 nsstring*strfaqplist=[[nsbundle mainbundle]pathforresource:@“faqdata”of type:@“plist”]; arrfaqdata=[[nsmutablearray alloc]initWithContentsOfFile:strFaqList]; [超级视图加载]; } -(无效)解除锁定{ [arrfaqdata发布]; [超级DealLoc]; } < /代码> <你还可以看到其他几个风景。在其中一个视图中,我使用导航控制器来导航一些表格数据。当用户单击此选项卡时,我将加载导航控制器,该控制器反过来加载我正在使用的表视图。问题是我在加载TableView控制器时得到以下错误:

    -[UIViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x6b37b10
    

    我在任何地方都读过,这种类型的错误通常来自于ib中的错误连接,或者视图控制器中的类不正确。这是我的代码和ib的屏幕截图,帮助我调试它。

    事先谢谢!

    我收到的错误

    alt text ib中的TableView连接

    alt text 文件所有者的类 alt text 我的接口文件

    @interface FAQListViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> {
    
        // Dictionary that will hold the FAQ Key/Values
        NSMutableArray  *arrFAQData;
    
    }
    

    实施

    @implementation FAQListViewController
    
    // Implementation for UITableView numberOfRowsInSection protocol
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    
        return [arrFAQData count];
    
    }
    
    // Implementation for UITableView cellForRowAtIndexPath protocol
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
        // See if we have any cells available for reuse
        UITableViewCell *objCell = [tableView dequeueReusableCellWithIdentifier:@"FAQCell"];
        if (objCell == nil) {
    
            // No reusable cell exists, so let's create a new one
            objCell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: @"FAQCell"];
    
        }
    
        // Give it data
        NSDictionary *objRow = [arrFAQData objectAtIndex: [indexPath row]];
        objCell.textLabel.text = [objRow valueForKey:@"Title"];
    
        // Return the created cell
        return objCell;
    
    
    }
    
    // Selection Event Handler
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    
        // Get the value for the selected key
        NSDictionary *dictRow = [arrFAQData objectAtIndex:[indexPath row]];
        NSString *strURL = [dictRow valueForKey: @"URL"];
    
        // Alert result
        UIAlertView *objAlert;
        objAlert = [[UIAlertView alloc] initWithTitle:@"Alert" message: strURL delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
    
        // Release created objects
        [objAlert show];
        [objAlert release];
    
        // Deselect row
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    }
    - (void)viewDidLoad {
    
        // Pull in FAQ from Plist
        NSString *strFAQPlist = [[NSBundle mainBundle] pathForResource:@"FAQData" ofType:@"plist"];
        arrFAQData = [[NSMutableArray alloc] initWithContentsOfFile: strFAQPlist];
    
    
        [super viewDidLoad];
    }
    
    - (void)dealloc {
    
        [arrFAQData release];
    
    
        [super dealloc];
    }
    
    2 回复  |  直到 14 年前
        1
  •  1
  •   Chris Garrett    14 年前

    首先,这是一个构建良好的问题,我希望每个人都发布屏幕截图和完整的源代码。-)

    看起来消息被发送到通用的uiviewcontroller,而不是faqlistviewcontroller。这告诉我,当您实例化faqlistviewcontroller时,您可能正在创建uiviewcontroller的实例?

    要实例化FAQ列表,您应该使用如下内容:

    [[FAQListViewController alloc] initWithNibName: @"FAQViewController" bundle: nil];

    如果您将其实例化为:

    [[UIViewController alloc] initWithNibName: @"FAQViewController" bundle: nil];

        2
  •  0
  •   Toastor    14 年前

    尝试以编程方式建立委托和数据源连接。我有一个类似的问题是,除非我以编程方式建立了连接,否则没有任何明显的原因(而其他委托方法按预期工作)调用UITableViewDelegate协议的可选方法。但是,由于该方法是可选的,因此没有引发异常。