原型单元不工作时如何使用segue

时间:2015-01-10 01:59:20

标签: ios objective-c uitableview

我有一个显示Feed的RSS阅读器,然后当点击自定义单元格时,应该会将您带到文章中。这一切都正常工作,但后来我改变它,以便它可以使用自定义单元格。为了做到这一点,我不得不从故事板中删除所有原型单元格,随后删除了单元格和详细视图之间的segue。当我在应用程序崩溃时添加原型单元格而没有任何错误。我很迷茫。如何在不使用原型单元格或segue的情况下将其带入详细视图?我试过didSelectRowAtIndexPath,但这是一个UIViewController而不是UITableViewController。如果您有任何想法,我的桌面视图代码如下所示。

#import "APPMasterViewController.h"

    #import "APPDetailViewController.h"
    #import "IITableViewCell.h"

    @interface APPMasterViewController () {
        NSXMLParser *parser;
        NSMutableArray *feeds;
        NSMutableDictionary *item;
        NSMutableString *title;
        NSMutableString *link;
        NSString *element;
    }
    @end

    @implementation APPMasterViewController

    - (void)awakeFromNib
    {
        [super awakeFromNib];
    }

    - (void)viewDidLoad {
        [super viewDidLoad];
        [[UINavigationBar appearance] setBarTintColor:[UIColor greenColor]];

        feeds = [[NSMutableArray alloc] init];
        NSURL *url = [NSURL URLWithString:@"http://example.com/?feed=rss"];
        parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
        [parser setDelegate:self];
        [parser setShouldResolveExternalEntities:NO];
        [parser parse];
    }

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

    #pragma mark - Table View

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return feeds.count;
    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        static NSString *simpleTableIdentifier = @"IITableViewCell";

        IITableViewCell *cell = (IITableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

        if (cell == nil)
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"IITableViewCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];
        }

        cell.mainTextLabel.text = [[feeds objectAtIndex:indexPath.row] objectForKey: @"title"];

        return cell;
    }

    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

        element = elementName;

        if ([element isEqualToString:@"item"]) {

            item    = [[NSMutableDictionary alloc] init];
            title   = [[NSMutableString alloc] init];
            link    = [[NSMutableString alloc] init];

        }

    }


    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

        if ([elementName isEqualToString:@"item"]) {

            [item setObject:title forKey:@"title"];
            [item setObject:link forKey:@"link"];

            [feeds addObject:[item copy]];

        }

    }

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

        if ([element isEqualToString:@"title"]) {
            [title appendString:string];
        } else if ([element isEqualToString:@"link"]) {
            [link appendString:string];
        }

    }

    - (void)parserDidEndDocument:(NSXMLParser *)parser {

        [self.tableView reloadData];

    }
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {

        return 78;
    }


    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        if ([[segue identifier] isEqualToString:@"showDetail"]) {

            NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
            NSString *string = [feeds[indexPath.row] objectForKey: @"link"];
            [[segue destinationViewController] setUrl:string];

        }
    }

    @end

2 个答案:

答案 0 :(得分:1)

如果你使用UIViewController没关系,你只需要实现UITableViewDelegate协议来启用:

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

您可以在UIViewController的viewDidLoad方法

中设置委托
- (void)viewDidLoad {

  self.tableView.delegate = self;
  // UITableViewDataSource is another protocol you should implement
  self.tableView.dataSource = self;

}

您可以通过CTRL拖动到下一个视图控制器来设置segue。确保你设置了segue的标识符,在这种情况下是“MySegue” Setting up segue

接下来实现tableView:didSelectRowAtIndexPath:

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

    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    [self performSegueWithIdentifier:@"MySegue" sender:cell];
}

在这种方法中你调用segue,你可以发送任何id作为发送者,在这种特殊情况下我们发送单元格

之后如果你想准备segue实现,可以在任何UIViewController上使用以下方法

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

    if ([segue.identifier isEqualToString:@"MySegue"]) {
        // prepare for segue here
    }
}

答案 1 :(得分:0)

我不确定您的问题究竟是什么,但作为一般规则,您可以通过在标识符输入中指定单元格的名称来添加自定义单元格,以便您可以在代码中引用它。

然后,您可以按住Ctrl键并单击您的单元格,然后在故事板中拖动到您选择的详细视图控制器,选择所需的segue类型,然后单击segue并在属性中设置标识符面板。您可以在方法prepareForSegueperformSegueWithIdentifier中的代码中引用此segue。这会回答你的问题吗?