سؤال

وبعد تحليل البيانات JSON في فئة البيانات، أنا وضعت NSArray الملكية * عناوين وUIViewController في طريقة fillArrays من نفس الفئة البيانات. في طريقة viewDidAppear من بلدي UIViewController، أدعو reloadData على بلدي UITableView. حرائق numberOfSectionsInTableView والعوائد 1، ثم الحرائق numberOfRowsInSection وإرجاع عدد مجموعة من 4 (لمدة 4 السلاسل في مجموعة). ومع ذلك، ومراقبة لم يحصل على cellForRowAtIndexPath وأواجه أصعب وقت في فهم لماذا، لا سيما وأن لدي أقسام وصفوف صالحة. الخلايا كلها واضحة.

ولقد أضاف البروتوكولات UITableViewDataSource وUITableViewDelegate إلى واجهة UIViewController وتعيين مندوب UITableView ومصدر البيانات في تقرير المصير في viewDidLoad (والتي يتم التحقق أيضا من الطرق الصف والقسم العد يطلق عليها).

وأنا أتساءل عما إذا كان لديه شيء لمعي إعادة تهيئة UIViewController في Data.m من أجل وضع خصائصه.

في Data.m:

- (void)fillArrays:(NSArray *)jsonObjs {
    NSLog(@"fillArrays");               
    HeadlinesRootViewController *hrvc = [[HeadlinesRootViewController alloc] init];
    hrvc.headlines = [self getJsonValuesForKey:@"headline" inArrayOfObjects:jsonObjs];
    [hrvc viewDidAppear:NO];
}

في ViewController.m:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"viewDidLoad");
    // Table view
    headlineTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 180, self.view.bounds.size.width, 300) style:UITableViewStylePlain];
    [headlineTableView setDelegate:self];
    [headlineTableView setDataSource:self];
    // Temporary
    self.headlines = [[NSMutableArray alloc] initWithObjects:@"headline1", @"headline2", @"headline3", @"headline4", nil];



    [self.view addSubview:headlineTableView];
    self.headlineTableView = headlineTableView;
    [headlineTableView release];
}
- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    NSLog(@"viewdidappear");
    NSLog(@"headlines: %@", self.headlines); // Returns an array of 4 headlines
    if( [self.headlines count] != 0 ){
        [self.headlineTableView reloadData];
    }
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    NSLog(@"numberOfSectionsInTableView: 1");
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"numberOfRowsInSection: %d", [self.headlines count]);
    return [self.headlines count];
}

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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.text = [[NSString alloc] initWithFormat:@"%@", [self.headlines objectAtIndex:indexPath.row]];

    return cell;
}
هل كانت مفيدة؟

المحلول

في fillArrays، يمكنك إنشاء وحدة تحكم وجهة نظر أخرى - ولكنك لم تفعل أي شيء معها أو وجهة نظرها، وكنت لا ترى هذا الرأي. هل لا يدعون viewDidAppear يدويا إما أن يحدث تلقائيا عندما يتم عرض وجهة نظر تحكم عرض (فقط في سياق وحدة تحكم الملاحة على الرغم من).

وعادة التدفق، يمكنك إنشاء وحدة تحكم الرأي وإما إضافة هذا الرأي باعتباره subview من العرض الحالي، أو يدفع به باعتباره نافذة جديدة عبر وحدة تحكم الملاحة. أنا متأكد من القضية بأكملها هي أنها أبدا بإضافة جدول إلى أي شخص رأي يرى في الواقع، لذلك يدعو الجدول أساليب أخرى لكنه لم يدعو cellForRow لأن ببساطة لا يتم استدعاء التعليمات البرمجية layoutSubviews لها.

نصائح أخرى

هل أضاف tableView لوجهة نظر UIViewController؟

وهذا ما حدث لي، وعندما أضفت هذا

[self.view addSubview:table];
[table release];

والتي ثم cellForRowAtIndexPath العمل.

لأجل جوجل:

إذا العوائد tableView:numberOfRowsInSection صفر لأي tableView:cellForRowAtIndexPath السبب لن الحصول على استدعاء لأنه لا توجد صفوف أن نسميها ل.

وتحقق للتأكد من أن مندوب tableView ومصدر البيانات وأشار إلى viewController

وأنا لا أرى أي شيء خاطئ مع الكود كما هو، هل تحقق مع نقاط الوصول التي cellForRow أبدا (على الرغم من أنني أراك لديه بيان السجل)؟

وأيضا أود أن مجرد محاولة لفحص التعقل العودة "1" صراحة في rowsInSection، وترميز ثابت للسلسلة في خلية كنت ستعود في cellForRow.

إذا فشل كل شيء آخر، إنشاء وحدة تحكم عرض جدول جديد من القوالب كسكودي ووضع المكالمات في هناك - ثم عندما يعمل ذلك، والعمل الوراء لماذا الشفرة لا

وبالإضافة إلى ذلك، سيكون من الجيد أن نرى رمز الإعداد viewDidLoad الخاص بك (إضافة إلى الإجابة أعلاه من فضلك).

وإذا كنت تحديد مندوب ومصدر البيانات في viewDidLoad، فإن ذلك قد يكون مصدر الشوائب. يمكنك تعيين مصدر بيانات ومندوب في الحرف الأول؟

وأنا لست متأكدا من أن قمت بإضافة UITableView الخاص بك كما subview إلى UIViewController.view. وكانت هذه وجهة نظري على أية حال.

في هذا النهج، وجدت لم الإعدام لا ندخل cellForRowAtIndexPath حتى بعثت UIViewController.view إلى الخلف بعد إضافة UITableView كما subview.

والحصول على هذا كان بعيدا سوى جزء من المشكلة. عند هذه النقطة، يبدو أن بلدي التحكم عرض أخرى لم تعد تستجيب للمس الأحداث. لقد وجدت أنني عندما أيضا إضافة UITableView باعتباره subview إلى rootViewController، عن وجهات نظري حصلت أحداث اتصال المناسبة.

وشكرا PXL كثيرا. عندما أقوم بتحريك التهيئة UITableView من viewDidLoad إلى:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil"

وأنها تعمل تماما أي وقت مضى عندما جعل حذف أو تحديث بعض الصفوف يحصل reloded وUITableView إلى بلدي UIView.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top