UICollectionView:didSelectItemAtIndexPath: Как да попълня нов изглед с данни въз основа на селекция?

Ето сделката:

Имам UICollectionView, който се попълва от масив от обекти. Искам да мога да докосна един от изгледите, представляващи обект в моя изглед на UICollection, и да бъда отведен до нов изглед, показващ подробности за обекта, който съм избрал в UICollectionView (например ID на избрания обект).

За съжаление, каквото и да се опитам да задам, винаги е нула!

Ето го обекта:

@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