Segue没有在TableViewController中更新

时间:2015-03-24 13:34:18

标签: ios objective-c uitableview segue

下午好,

我在我的TableViewController中创建了一个Segue,用户可以在其中触摸用户个人资料,并将该用户名发送到ProfileViewController,其中加载了用户信息(帖子,图片,信息等)。 。)(类似于Facebook墙)。

问题是,当我触摸一个用户时,它会正确显示所有内容,但是当我触摸另一个配置文件图像时,它会再次显示相同的ProfileViewController,就像用户名未更新而发送错误一样。

当我触摸屏幕上的任何地方然后再次触摸用户个人资料时,在这种情况下它可以工作,但我需要在每种情况下都能完成这项工作。

我要发布我的TableViewController如果这有助于您找到问题,因为它几乎正常工作,我唯一需要修复的是没有更新的用户名( Tap Gesture Recognizer 在图片上方。)

segues位于代码的末尾。

TableViewController.m

//
//  CarTableViewController.m
//

#import "CarTableViewController.h"
#import "CarTableViewCell.h"
#import "CarTableViewController.h"
#import "CarDetailViewController.h"
#import "OtherProfileUserViewController.h"
#import <SDWebImage/UIImageView+WebCache.h>

@implementation CarTableViewController

@synthesize carMakes = _carMakes;
@synthesize carModels = _carModels;
@synthesize carImages = _carImages;

@synthesize likes = _likes;
@synthesize comments = _comments;
@synthesize username = _username;
@synthesize refuser = _refuser;
@synthesize profileImage = _profileImage;

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self fetchJson];

    [self.tableView reloadData];

    // Initialize the refresh control.
    self.refreshControl = [[UIRefreshControl alloc] init];
    //self.refreshControl.backgroundColor = [UIColor blackColor];
    //self.refreshControl.tintColor = [UIColor whiteColor];
    [self.refreshControl addTarget:self
                            action:@selector(fetchJson)
                  forControlEvents:UIControlEventValueChanged];
}

- (void)viewWillAppear:(BOOL)animated
{
    self.navigationController.navigationBar.hidden = YES;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [_jsonArray count];
}


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

    CarTableViewCell *cell = [tableView
                              dequeueReusableCellWithIdentifier:CellIdentifier];

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

    // Configure the cell...
    cell.makeLabel.text = [[_jsonArray objectAtIndex:indexPath.row] valueForKey:@"id"];
    cell.likes.text = [[_jsonArray objectAtIndex:indexPath.row] valueForKey:@"likes"];
    cell.comments.text = [[_jsonArray objectAtIndex:indexPath.row] valueForKey:@"comments"];
    cell.username.text = [[_jsonArray objectAtIndex:indexPath.row] valueForKey:@"username"];
    cell.refuser.text = [[_jsonArray objectAtIndex:indexPath.row] valueForKey:@"user_ref"];

    cell.modelLabel.text = [[_jsonArray objectAtIndex:indexPath.row] valueForKey:@"user"];

    NSURL * imageURL = [NSURL URLWithString:[[_jsonArray objectAtIndex:indexPath.row] valueForKey:@"imagen"]];

    [cell.carImage setImageWithURL:imageURL placeholderImage:[UIImage imageNamed:@"imagen"] options:SDWebImageRefreshCached];

    NSURL * imageURL2 = [NSURL URLWithString:[[_jsonArray objectAtIndex:indexPath.row] valueForKey:@"image"]];

    [cell.profileImage setImageWithURL:imageURL2
                      placeholderImage:[UIImage imageNamed:@"image"]
                            options:SDWebImageRefreshCached];

    return cell;
}

-(void)fetchJson {

    self.carModels = [[NSMutableArray alloc] init];
    self.carMakes = [[NSMutableArray alloc] init];
    self.carImages = [[NSMutableArray alloc] init];
    self.likes = [[NSMutableArray alloc] init];
    self.comments = [[NSMutableArray alloc] init];

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{

        NSString * urlString = [NSString stringWithFormat:@"http://website.com/service.php"];
        NSURL * url = [NSURL URLWithString:urlString];
        NSData * data = [NSData dataWithContentsOfURL:url];

        NSError *error;
        [_jsonArray removeAllObjects];
        _jsonArray = [NSJSONSerialization
                      JSONObjectWithData:data
                      options:NSJSONReadingMutableContainers|NSJSONReadingMutableLeaves
                      error:&error];


            for(int i=0;i<_jsonArray.count;i++)
            {
                NSDictionary * jsonObject = [_jsonArray objectAtIndex:i];
                NSString* imagen = [jsonObject objectForKey:@"imagen"];
                [_carImages addObject:imagen];

                NSDictionary * jsonObject2 = [_jsonArray objectAtIndex:i];
                NSString* user = [jsonObject2 objectForKey:@"user"];
                [_carMakes addObject:user];

                NSDictionary * jsonObject3 = [_jsonArray objectAtIndex:i];
                NSString* date = [jsonObject3 objectForKey:@"date"];
                [_carModels addObject:date];
            }
         NSLog(@"carModels ==> %@", _jsonArray);

        dispatch_async(dispatch_get_main_queue(), ^{
            {
                [self.tableView reloadData];
                [self.refreshControl endRefreshing];
            }});

        }
    );
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"segueprofile"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        OtherProfileUserViewController *destViewController = segue.destinationViewController;
        destViewController.recipeName = [[_jsonArray objectAtIndex:indexPath.row] valueForKey:@"username"];
    }
    if ([segue.identifier isEqualToString:@"segueprofile2"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        OtherProfileUserViewController *destViewController = segue.destinationViewController;
        destViewController.recipeName = [[_jsonArray objectAtIndex:indexPath.row] valueForKey:@"username"];
    }
}

@end

提前致谢。

3 个答案:

答案 0 :(得分:0)

好的,这是其中一个选项。 1.删​​除所有现有的segues(segueprofile和segueprofile2) 2.通过push-segue将您的tableviewcontroller(重要:不是tableview,但控制器本身)与您的详细信息控制器连接并命名为segueprofile3 3.以下列方式重构代码

@property (nonatomic, strong) NSIndexPath * selectedIndexPath;

...

- (void)tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)anIndexPath {
    self.selectedIndexPath = anIndexPath;
    [self performSegueWithIdentifier:@"segueprofile3" sender:nil];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"segueprofile3"]) {
        OtherProfileUserViewController *destViewController = segue.destinationViewController;
        destViewController.recipeName = [[_jsonArray objectAtIndex:selectedIndexPath.row] valueForKey:@"username"];
    }
}

答案 1 :(得分:0)

另一种选择。将UIButton控件放在头像UIImageView上。在CarTableViewCell类中创建关联的IBOutlet并建立插座连接。

@property (nonatomic, weak) UIButton * btnAvatar;

接下来,修改CarTableViewController代码

//1. declare new propery
@property (nonatomic, strong) id selectedProfile;

//2. implement future button tap handler
-(IBAction) btnAvatarDidPress:(id) sender {
  int tag = ((UIButton *) sender).tag;
  self.selectedProfile = [_jsonArray objectAtIndex:tag];
  [self performSegueWithIdentifier:@"segueprofile3" sender:nil];
}


//Extend your cellForRowAtIndexPath method
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"carTableCell";

    CarTableViewCell *cell = [tableView
                              dequeueReusableCellWithIdentifier:CellIdentifier];

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

    // Configure the cell...
    cell.makeLabel.text = [[_jsonArray objectAtIndex:indexPath.row] valueForKey:@"id"];
    cell.btnAvatar.tag = indexPath.row;
... rest of method
}

然后删除didSelectRowAtIndexPath方法,并将btnAvatar Touch Up Inside操作连接到控制器代码中的btnAvatarDidPress方法。 这就是我希望我什么也没有忘记。

答案 2 :(得分:0)

这是你的例子,在prepareForSegue中,获取按钮所在的单元格:

id v = sender;
while (![(v= v.superView) isKindOfClass:[UITableViewCell class]] 
       && v!=nil) ;
if (v==nil) 
  // no ancestor view is cell.
else{
  // now v is the cell.
  NSIndexPath * indexPath = [self.tableView indexPathForCell:v];
  // do the left
}