当原型单元不工作时如何使用 segue
How to use a segue when prototype cells are not working
我有一个显示提要的 RSS reader,然后当单击自定义单元格时应该会将您带到文章。一切正常,但后来我对其进行了更改,以便它可以与自定义单元格一起使用。为了做到这一点,我不得不从故事板中删除所有原型单元格,随后删除了单元格和详细视图之间的转场。当我在应用程序中重新添加一个原型单元格时,它崩溃了,没有任何错误。我很困扰。我如何在不使用原型单元格或 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
我不确定您的问题到底是什么,但一般来说,您可以通过在标识符输入中指定单元格的名称来添加自定义单元格,以便您可以在代码中引用它。
然后,你可以 ctrl+click 到你的单元格,然后拖到你在故事板中选择的详细视图控制器,你 select 你想要的那种 segue,然后你点击 segue 然后你在属性面板中设置标识符。你在代码中引用这个 segue,在方法 prepareForSegue
或 performSegueWithIdentifier
中。这是否回答了您的问题?
使用 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"
下一个工具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
}
}
我有一个显示提要的 RSS reader,然后当单击自定义单元格时应该会将您带到文章。一切正常,但后来我对其进行了更改,以便它可以与自定义单元格一起使用。为了做到这一点,我不得不从故事板中删除所有原型单元格,随后删除了单元格和详细视图之间的转场。当我在应用程序中重新添加一个原型单元格时,它崩溃了,没有任何错误。我很困扰。我如何在不使用原型单元格或 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
我不确定您的问题到底是什么,但一般来说,您可以通过在标识符输入中指定单元格的名称来添加自定义单元格,以便您可以在代码中引用它。
然后,你可以 ctrl+click 到你的单元格,然后拖到你在故事板中选择的详细视图控制器,你 select 你想要的那种 segue,然后你点击 segue 然后你在属性面板中设置标识符。你在代码中引用这个 segue,在方法 prepareForSegue
或 performSegueWithIdentifier
中。这是否回答了您的问题?
使用 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"
下一个工具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
}
}