UICollectionView:didSelectItemAtIndexPath: как заполнить новое представление данными на основе выбора?

Вот сделка:

У меня есть UICollectionView, который заполняет себя массивом объектов. Я хочу иметь возможность коснуться одного из представлений, представляющих объект в моем представлении UICollection, и перейти к новому представлению, отображающему детали объекта, который я выбрал в UICollectionView (например, идентификатор выбранного объекта).

К сожалению, все, что я пытаюсь установить, всегда равно нулю!

Вот объект:

@interface obj : NSObject

    @property (nonatomic, strong) NSString *objId;
    ...
    @property (nonatomic, strong) NSString *imageURL;

@end

Вот главный контроллер представления:

@interface ViewController : UIViewController <UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>

    @property (weak, nonatomic) IBOutlet UICollectionView *badgesCollectionView;
    @property (strong, nonatomic) NSArray *objArray;
    ...

@end

Вот подробный вид:

@interface DetailViewController : UIViewController

    @property (weak, nonatomic) IBOutlet UILabel *objId;

@end

Здесь я пытаюсь заполнить подробное представление (в моем основном ViewController.m)

// Implement action for object selection
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{

    DetailViewController *detailView = [[DetailViewController alloc] init];

    detailView.objIdLabel.text = [[self.objArray objectAtIndex:indexPath.row] objId];

    [self.navigationController pushViewController:detailView animated:YES];

    NSLog(@"Object Selection: Report");
    NSLog(@"Label Text      : %@", detailView.objId.text);
    NSLog(@"Id of object    : %@", [[self.objArray objectAtIndex:indexPath.row] objId]);

}

Когда я выбираю объект в UICollectionView, я получаю переход к detailView без каких-либо заполнений. Вот что записано:

Object Selection: Report
Label Text      : (null)
Id of object    : f0f47920-f449-4fd0-a74e-804546905437

Любое понимание этого было бы фантастическим. Спасибо!


person conner.xyz    schedule 12.02.2014    source источник
comment
вы используете раскадровки?   -  person user3071962    schedule 13.02.2014


Ответы (4)


Вывод текстового поля UILabel равен нулю, потому что свойство метки на самом деле не связано ни с чем, пока представление не будет загружено. В этом случае это не произойдет, пока вы не нажмете представление. Чтобы обойти это, вы можете просто иметь свойство на вашем DetailViewController, которое содержит строку, пока не появится представление.

Затем в viewDidLoad или viewWillAppear в DetailViewController вы можете установить текст на objIdLabel в свойство, содержащее строку

person mrosales    schedule 13.02.2014

Проблема может исходить из реализации DetailViewController.

DetailViewController *detailView = [[DetailViewController alloc] init];

только инициализируйте контроллер

но вы заявляете

@interface DetailViewController : UIViewController

    @property (weak, nonatomic) IBOutlet UILabel *objId;

@end

что означает, что вы должны использовать xib.

Итак, сначала вам нужно использовать

DetailViewController *detailView = [[DetailViewController alloc] initWithNibName:@"DetailViewXIBName" bundle:nil]; 

затем попробуйте изменить значение на objIdLabel после нажатия контроллера:

- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{

    DetailViewController *detailView = [[DetailViewController alloc] initWithNibName:@"DetailViewXIBName" bundle:nil]; 

    [self.navigationController pushViewController:detailView animated:YES];

    detailView.objIdLabel.text = [[self.objArray objectAtIndex:indexPath.row] objId];

    NSLog(@"Object Selection: Report");
    NSLog(@"Label Text      : %@", detailView.objId.text);
    NSLog(@"Id of object    : %@", [[self.objArray objectAtIndex:indexPath.row] objId]);

} 

Вы должны воздействовать на текст после вызова [super viewDidLoad];.

Это всего лишь предположения, поскольку у нас есть только ограниченная информация.

person Alban    schedule 12.02.2014

Это может вытолкнуть пустой контроллер представления, потому что вы не сильно держитесь за detailView.

Попробуйте добавить:

@property (nonatomic, strong) DetailViewController *detailView;

в основной ViewController, затем в методе didSelectItemAtIndexPath:

// Implement action for object selection
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{

    self.detailView = [[DetailViewController alloc] init];

    self.detailView.objIdLabel.text = [[self.objArray objectAtIndex:indexPath.row] objId];

    [self.navigationController pushViewController:self.detailView animated:YES];
}
person Tim. S.    schedule 12.02.2014

Оказывается, это сводится к жизненному циклу xib. Это правда, как многие из вас предположили, что detailView на самом деле не связан со всеми связанными с ним элементами (например, objId UILabel), пока он не загружен.

В итоге я исправил это, создав новый объект одноэлементной модели, чтобы удерживать выбранный объект. Затем я смог установить выбранный объект в синглтоне из моего основного контроллера представления и вызвать его из detailView, чтобы установить мой objId на ViewDidLoad.

person conner.xyz    schedule 13.02.2014