iOS - 如何从UITableViewCell

时间:2015-05-30 11:40:35

标签: ios objective-c uiviewcontroller tableview tableviewcell

我有UIViewController TableViewTableView填充了每个单元格的图像和文本。现在,当用户点击一个单元格时,我需要显示其他人Scenes。例如:


  - 点击第一行 - >现在ViewController1
- 点击第二行 - >目前ViewController2


ViewController1ViewController2是我Storyboard中的场景。

我尝试了各种解决方案,但这些方法都没有。此外,当我点击一个单元格时(例如我试图显示警报),似乎没有调用方法didSelectRowAtIndexPath:

这里是我的ViewController的代码: 的 ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
{
    NSArray *recipes;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    recipes = [NSArray arrayWithObjects:@"News", @"Calendar",@"Take a photo",@"Draw",@"Mail us",@"Follow us on Facebook", nil];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

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

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

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

    cell.textLabel.text = [recipes objectAtIndex:indexPath.row];

    if ([cell.textLabel.text isEqualToString:recipes[0]]) {
        cell.imageView.image = [UIImage imageNamed:@"newsicon"];
    }
    else if ([cell.textLabel.text isEqualToString:recipes[1]]) {
        cell.imageView.image = [UIImage imageNamed:@"mensaicon"];
    }
    else if ([cell.textLabel.text isEqualToString:recipes[2]]) {
        cell.imageView.image = [UIImage imageNamed:@"fotoicon"];
    }
    else if ([cell.textLabel.text isEqualToString:recipes[3]]) {
        cell.imageView.image = [UIImage imageNamed:@"drawicon"];
    }
    else if ([cell.textLabel.text isEqualToString:recipes[4]]) {
        cell.imageView.image = [UIImage imageNamed:@"mailicon"];
    }
    else if ([cell.textLabel.text isEqualToString:recipes[5]]) {
        cell.imageView.image = [UIImage imageNamed:@"fbicon"];
    }

    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // here we get the cell from the selected row.
    UITableViewCell *selectedCell=[tableView cellForRowAtIndexPath:indexPath];

    if ([selectedCell.textLabel.text isEqualToString:recipes[0]]) {
        UIAlertView *messageAlert = [[UIAlertView alloc]
                                     initWithTitle:@"Row Selected" message:@"You've selected a row" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

        // Display Alert Message
        [messageAlert show];

        NSString *storyboardName = @"Main";
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
        UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"news"];
        [self presentViewController:vc animated:YES completion:nil];
    }

    // use the image in the next window using view controller instance of that view.
}


@end

我是iOS开发的新手,所以我不知道我的代码是否正确,或者是否有更优雅的其他解决方案。无论如何,让我们关注这个问题,任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:1)

  

此外,当我点击一个单元格时,似乎没有调用方法didSelectRowAtIndexPath :(例如我试图显示警报)。

您的基础课程为 { int value=0; int count=0; for(int x=binary.length()-1;x>=0;x--) { value+=Integer.parseInt(binary.charAt(x)+"")*Math.pow(2,count++); } String hexa=Integer.toHexString(value); System.out.println(hexa); } ,因此您的UIViewControllerUITableViewDelegate不会自动设置。你需要自己做。例如,您可以在UITableViewDataSource函数中设置它们:

init

另一种方法是使用- (instancetype)init { self = [super init]; if( self ) { self.delegate = self; self.datasource = self; } return self; } 作为您的基本电话,然后您不必担心设置代表。

答案 1 :(得分:1)

如果您的视图只是一个表视图,我建议使用UITableViewController而不是UIViewController。如果现有的UIViewController中有UITableView,则需要自己设置委托和数据源方法。
您可以在故事板中执行此操作。单击tableView,然后选择连接检查器。然后单击dataSource旁边的圆圈并将其拖动到视图控制器。为代表做同样的事情。这可能就是为什么你的表视图方法没有被调用的原因。

如果它是静态表,您可以从故事板中的每个单元格创建独立的segue。

答案 2 :(得分:0)

根据您的代码警报仅在您单击第一个单元格时显示.. 但是根据你的需要,让我写一个代码来帮助你..

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // here we get the cell from the selected row.
    NSString *selectedcelltext=[recipes objectAtIndex:indexPath.row];

    UIAlertView *messageAlert = [[UIAlertView alloc]
                                 initWithTitle:@"Row Selected" message:[NSString stringWithFormat:@"You've selected a %@ row ",selectedcelltext] delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];

    // Display Alert Message
    [messageAlert show];


    if ([selectedcelltext isEqualToString:recipes[0]]) {

        NSString *storyboardName = @"Main";
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
        UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"news"];
        [self presentViewController:vc animated:YES completion:nil];
    }
    else  if ([selectedcelltext isEqualToString:recipes[1]]) {

        NSString *storyboardName = @"Main";
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
        UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"calendar"];
        [self presentViewController:vc animated:YES completion:nil];
    }


    // use the image in the next window using view controller instance of that view.
}