UITableView segue无法正常工作

时间:2013-04-24 02:24:41

标签: ios uitableview segue

我在文档中使用了SimpleDrillDown应用程序示例,该应用程序在第一个UITableView中显示锻炼名称,在第二个UITableView中显示锻炼。

我的应用位于Dropbox:http://db.tt/V0EhVcAG

我使用了故事板,有原型单元格,但是当我在模拟器中加载时,第一个UITableView不会让我点击并转到细节UITableView。披露指标V形不加载。该应用程序构建成功,没有正式错误。

我的表格视图位于导航控制器中,我的segue和prototype单元格都在故事板中相应命名。

SpitfireViewController.m

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [dataController countOfList];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"WorkoutCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    Workout *workoutAtIndex = [dataController objectInListAtIndex:indexPath.row];
    cell.textLabel.text = workoutAtIndex.title;

    return cell;
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showExercises"]) {
        NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow];

        DetailViewController *detailViewController = [segue destinationViewController];

        detailViewController.workout = [dataController objectInListAtIndex:selectedRowIndex.row];
    }
}

DetailViewController.m

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

    return [workout.exercises count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"ExerciseCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.text = [workout.exercises objectAtIndex:indexPath.row];
    return cell;
}

AppDelegate.h

#import <UIKit/UIKit.h>
@class DataController;
@class SpitfireViewController;

@interface SpitfireAppDelegate : UIResponder <UIApplicationDelegate>
{
    UIWindow *window;
    SpitfireViewController *spitfireViewController;
    DataController *dataController;
}

@property (strong, nonatomic) UIWindow *window;

@end

AppDelegate.m

#import "SpitfireAppDelegate.h"
#import "SpitfireViewController.h"
#import "DataController.h"

@implementation SpitfireAppDelegate
@synthesize window;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    spitfireViewController = [[SpitfireViewController alloc] init];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:spitfireViewController];

    DataController *controller = [[DataController alloc] init];
    spitfireViewController.dataController = controller;

    [window addSubview:[navController view]];
    [self.window makeKeyAndVisible];

    return YES;
}

@end

My Storyboard SpitfireViewController (Root) DetailViewController

4 个答案:

答案 0 :(得分:5)

如果您有tableview单元格选择问题。

A Tableview with selection enabled

  • 您需要先检查您的tableview是否允许选择
  • 使用“静态单元格”时,您无需实施UITableViewDelegateUITableViewDataSource
  • 您需要为辅助动作添加一个segue +一个用于选择的segue。

One segue for the table view selection another for the accessory action

答案 1 :(得分:1)

使用Storyboard时,通常会在“信息”标签下的“项目”设置中设置故事板文件名。在那里选择了故事板后,您基本上可以删除除return YES方法的application:didFinishLaunchingWithOptions:部分之外的所有内容。在故事板中为您完成了所有工作。

修改

您可以在此处设置故事板:

set main storyboard

还要确保将视图控制器设置为初始视图控制器:

set initial view controller

答案 2 :(得分:1)

我认为这是你的问题:

    spitfireViewController = [[SpitfireViewController alloc] init];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:spitfireViewController];

    DataController *controller = [[DataController alloc] init];
    spitfireViewController.dataController = controller;

您在这里创建的spitfireViewController不是故事板中的那个,它是一个新的。您应该删除所有这些代码,因为您已经在故事板中创建的导航控制器中嵌入了spitfireViewController。你应该在它的viewDidLoad方法中为spitfireViewController设置数据控制器:

    DataController *controller = [[DataController alloc] init];
    self.dataController = controller;

答案 3 :(得分:-1)

你的“didSelectRowAtIndexPath”方法在哪里?

我建议将其放入然后触发[self performSegueWithIdentifier:]以使用表格单元格中的数据作为发件人来触发segue。