tableview segue 到另一个视图控制器

Posted

技术标签:

【中文标题】tableview segue 到另一个视图控制器【英文标题】:tableview segue to another view controller 【发布时间】:2014-12-01 23:03:51 【问题描述】:

我是编程新手,可能被一个简单的问题挂断了。我在我的表格视图中为我的数组使用解析。选择该行后,我想转到另一个视图控制器上的搜索栏。 segue 工作正常,tableview 工作正常,但我似乎无法让 objectId 通过。

#import "bookmarkViewController.h"
#import "Parse/Parse.h"
#import <ParseUI/ParseUI.h>
#import "ViewController.h"

@implementation bookmarkViewController

@synthesize postArray;


#pragma mark - View lifecycle

- (void)viewDidLoad

    [super viewDidLoad];

    [self.navigationItem setLeftBarButtonItem:[[UIBarButtonItem alloc]                
initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self      
action:@selector(refreshButtonHandler:)]];



- (void)viewWillAppear:(BOOL)animated

    if ([PFUser currentUser])
        [self refreshButtonHandler:nil];


#pragma mark - Button handlers

- (void)refreshButtonHandler:(id)sender

    //Create query for all Post object by the current user
    PFQuery *postQuery = [PFQuery queryWithClassName:@"Post"];
    [postQuery whereKey:@"author" equalTo:[PFUser currentUser]];

    // Run the query
    [postQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) 
        if (!error) 
            //Save results and update the table
            postArray = objects;
            [self.tableView reloadData];
        
    ];


#pragma mark - Table view data source

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

    // Return the number of rows in the section.
    return postArray.count;


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

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView   
dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  
reuseIdentifier:CellIdentifier];
    

    // Configure the cell with the textContent of the Post as the cell's text label
    PFObject *post = [postArray objectAtIndex:indexPath.row];
    [cell.textLabel setText:[post objectForKey:@"textContent"]];

    return cell;


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath    
*)indexPath
    NSLog(@"cell tapped");
    PFObject *post = [postArray objectAtIndex:indexPath.row];
    NSLog(@"%@", post.objectId);
    [self performSegueWithIdentifier:@"searchBookmark" sender:self];




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

    ViewController *vc = [segue destinationViewController];

    vc.labelText = post.objectId;    
  



@end

在 vc.label.text 中,我总是使用未声明的标识符“post”,但我似乎不知道如何识别它。就是在上面的方法中。

NSLogs 正确回复 16:17:27.513 [App] 单元被点击 [应用] cgdVY7Eu9h

【问题讨论】:

查看这些Objective C 或Swift answers 【参考方案1】:

将您的 didSelectRowAtIndexPath 和 prepareForSegue 更改为:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath* )indexPath
    [self performSegueWithIdentifier:@"searchBookmark" sender:self];


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


    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

    NSLog(@"cell tapped");
    PFObject *post = [postArray objectAtIndex:indexPath.row];
    NSLog(@"%@", post.objectId);
    ViewController *vc = [segue destinationViewController];

    vc.labelText = post.objectId;    
    

【讨论】:

那么indexPath 是从哪里来的? 糟糕,抱歉。修复它【参考方案2】:

Post 是您在 didSelectRowAtIndexPath 中创建的局部变量,因此不能在该方法之外使用。解决此问题的简单方法是将 post 作为 sender 参数传递到 performSegueWithIdentifier:sender: 中。您可以将任何您想要的对象作为发送者传递。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath 
    NSLog(@"cell tapped");
    PFObject *post = [postArray objectAtIndex:indexPath.row];
    NSLog(@"%@", post.objectId);
    [self performSegueWithIdentifier:@"searchBookmark" sender:post];



- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    PFObject *post = (PFObject *)sender;
    ViewController *vc = [segue destinationViewController];

    vc.labelText = post.objectId;    

【讨论】:

这一直在 vc.labelText = post.objectId; 处抛出异常; @ClayD,这个方法应该产生与你标记为正确的答案相同的结果,所以我看不出一个如何工作,另一个产生错误。 对不起。我也没有。我只是粘贴了一个,然后粘贴了另一个,一个抛出了异常,另一个没有。我确定是我做的,而不是你做的!【参考方案3】:

UIViewController -> segue -> UITableViewController

我有一个问题,我用答案 -1- 解决了谢谢。 所以我有一种 UIViewController,我想用按钮连接到另一个 UITableViewController,我注意到它堆叠并被冻结。我无法滚动我的表格...

我的代码是:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
MasterViewController *controller =segue.destinationViewController;
controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentViewController:controller animated:YES completion:nil];
 

我的 CPU 超过 100% 过载。 所以答案 1 对我很有效。然后是新代码:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    MasterViewController *vc = [segue destinationViewController];
    

现在有 30 个条目的表格就像一个魅力 =)

【讨论】:

以上是关于tableview segue 到另一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

根据在 TableViews 自定义单元格中点击的图像执行 segue

单击TableView部分中的任意位置后如何执行segue?

获取 Segue 之间的变量

iOS 和 Swift:可以强制解开 tableView.indexPath?

将 segue 从一个视图控制器重定向到另一个视图控制器

从 tableView 委托类中调用视图控制器 segue