سؤال

ولدي التطبيق الذي يعمل بعض ما مشابهة لطريقة عمل آي فون تطبيق الاتصال. عندما نضيف يتم توجيه المستخدم الاتصال الجديد إلى طريقة عرض الشاشة فقط مع معلومات الاتصال. إذا كان لنا أن تحديد "جميع جهات الاتصال" من شريط التنقل، وأبحر المستخدم إلى قائمة جميع الاتصالات حيث الاتصال التي تمت إضافتها مؤخرا في الرأي.

ويمكننا تحريك العرض إلى صف معين باستخدام:

    [itemsTableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionBottom];

... ولكنه لا يعمل. ادعو هذا الحق بعد استدعاء:

    [tableView reloadData];

وأعتقد أنني لست لنفترض أن يدعو selectRowAtIndexPath:animated:scrollPosition طريقة هنا. ولكن إن لم يكن هنا، ثم أين؟

هل هناك أي طريقة مندوب أن يحصل على استدعاء بعد الأسلوب التالي؟

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
هل كانت مفيدة؟

المحلول

وأعتقد أنني قد حصلت على التطبيق مشابه: قائمة عنصر، انقر '+' -> الشاشة الجديدة، أعود وأنظر القائمة المحدثة، تمريره لإظهار هذا البند وأضاف في أسفل

.

وباختصار، أنا وضعت reloadData في viewWillAppear:animated: وscrollToRowAtIndexPath:... في viewDidAppear:animated:.

// Note: Member variables dataHasChanged and scrollToLast have been
// set to YES somewhere else, e.g. when tapping 'Save' in the new-item view.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    if (dataHasChanged) {
        self.dataHasChanged = NO;
        [[self tableView] reloadData];
    } else {
        self.scrollToLast = NO; // No reload -> no need to scroll!
    }
}

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    if (scrollToLast) {
        NSIndexPath *scrollIndexPath = [NSIndexPath indexPathForRow:([dataController count] - 1) inSection:0];
        [[self tableView] scrollToRowAtIndexPath:scrollIndexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    }
}

وآمل أن يساعد هذا. إذا قمت بإضافة شيء في منتصف القائمة، هل يمكن أن انتقل بسهولة إلى هذا المنصب بدلا من ذلك.

نصائح أخرى

ويمكنك أن تجرب ذلك، طلبي في نوع من تشبه لك عندما كنت اضغط على زر التمرير من uitableview متروك.

[tableviewname setContentOffset:CGPointMake(0, ([arrayofcontact count]-10)*cellheight) animated:YES];

و10 غير لعدد الخلية التي تريد انتقل لأعلى

وهذا الأمل سوف تساعدك: -)

والتمرير الرسوم المتحركة أمر لا مفر منه عند الإزاحة تعيين من viewDidAppear(_:). مكان أفضل للوضع التمرير الأولي الإزاحة viewWillAppear(_:). ستحتاج لإجبار تخطيط طريقة عرض جدول، لأنه لم يتم تعريف حجم المحتوى في هذه النقطة.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    tableView.setNeedsLayout()
    tableView.layoutIfNeeded()

    if let selectedIndexPath = selectedIndexPath, tableView.numberOfRows(inSection: selectedIndexPath.section) > 0 {
        tableView.scrollToRow(at: selectedIndexPath, at: .top, animated: false)
    }
}

هل لديك ما يكفي من الاتصالات وهمية إضافة إلى اختبار التمرير؟ ويبدو انه فقط عندما tableView الخاص بك هو من حجم معين فون يجد inputus للتمرير.

وهذا هو الرمز الذي يعمل بالنسبة لي في مشروعي. أنا استخدم زر السابق وبالتالي أنا تمرير tableview أبعد قليلا إلى أسفل ذلك فإنه عادة ما تذهب مع UITABLEVIEWSCROLLPOSITION. (سوف زر تقريري السابق لا تعمل إذا كان لا يمكن "رؤية" الخلية السابقة.

وتجاهل بعض استدعاءات الأسلوب المخصصة.

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    //Show the navButtons
    [self navButtonAnimation];


    DetailsStandardCell *cell = (DetailsStandardCell *)textField.superview.superview.superview;

    self.parentController.lastCell = cell;


    //Code to scroll the tableview to the previous indexpath so the previous button will work. NOTE previous button only works if its target table cell is visible.
    NSUInteger row = cell.cellPath.row;
    NSUInteger section = cell.cellPath.section;

    NSIndexPath *previousIndexPath = nil;


    if (cell.cellPath.row == 0 && cell.cellPath.section != 0) //take selection back to last row of previous section
    {
    NSUInteger previousIndex[] = {section -1, ([[self.sections objectForKey:[NSNumber numberWithInt:section - 1]]count] -1)};
    previousIndexPath = [[NSIndexPath alloc] initWithIndexes:previousIndex length:2];   
    }
    else if (cell.cellPath.row != 0 && cell.cellPath.section != 0)
    {
        NSUInteger previousIndex[] = {section, row - 1};
        previousIndexPath = [[NSIndexPath alloc] initWithIndexes:previousIndex length:2];       

    }


    [self.theTableView scrollToRowAtIndexPath: cell.cellPath.section == 0 ? cell.cellPath : previousIndexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];

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