سؤال

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

مثال على الصورة:

alt text alt text
رأسي المخصص:

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { 
       UIView* customView = [[[UIView alloc]initWithFrame:CGRectMake(10.0, 0.0, 300.0, 44.0)]autorelease];
       customView.backgroundColor = [UIColor lightGrayColor];

       UILabel * headerLabel = [[[UILabel alloc] initWithFrame:CGRectZero] autorelease];
            headerLabel.backgroundColor = [UIColor clearColor];
            headerLabel.opaque = NO;
            headerLabel.textColor = [UIColor darkGrayColor];
            headerLabel.font = [UIFont boldSystemFontOfSize:16];
            headerLabel.frame = CGRectMake(10, 7, 260.0, 44.0);
            headerLabel.textAlignment = UITextAlignmentCenter;
            NSDictionary *dictionary = [self.data objectAtIndex:section];
            headerLabel.text = [dictionary objectForKey:@"Title"];

            [customView addSubview:headerLabel];


            // add button to right corner of section
        UIButton* headerButton = [[UIButton alloc] initWithFrame:CGRectMake(10, 0, 320, 44)];
            headerButton.center = CGPointMake( 160.0, 22.0);
            headerButton.backgroundColor = [UIColor clearColor];
            headerButton.tag = section;
            [headerButton   addTarget:self action:@selector(expandSection:) forControlEvents:UIControlEventTouchUpInside];

            [customView addSubview:headerButton];

            return customView;
}

طريقة الرسوم المتحركة الخاصة بي:

- (void) expandSection:(id)sender {

    if (expandedSection == [sender tag]) {
        expandedSection = -1;
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else if (expandedSection == -1){
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else{
        [self.tableView beginUpdates];  
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone];
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates]; 

    }
    //[self.tableView reloadData];
}

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

تحرير: أعتقد أن المشكلة هي أن عمليات إعادة التحميل تسبب العرض المخصص إلى الأمثلة. لا يمكنني تحرير العرض لأنني بحاجة إليه كمرجع للقيام بالتحديث للرسوم المتحركة. أي أفكار حول ما يمكنني فعله لإصلاح هذا؟

هل كانت مفيدة؟

المحلول

تم العثور على الحل.

يجب إعادة تحميل الجدول قبل كل تغيير. وبهذه الطريقة ، يكون الجدول في أحدث حالة قبل إجراء أي تغييرات.

إضافة [self.tableview releoaddata] ؛ كدخول قبضة في طريقة "توسيع".

الشفرة:

- (void) expandSection:(id)sender {

  [self.tableView reloadData];

    if (expandedSection == [sender tag]) {
        expandedSection = -1;
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else if (expandedSection == -1){
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
    }else{
        [self.tableView beginUpdates];  
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:expandedSection] withRowAnimation:UITableViewRowAnimationNone];
        expandedSection = [sender tag];
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[sender tag]] withRowAnimation:UITableViewRowAnimationNone];
        [self.tableView endUpdates]; 

    }
    //[self.tableView reloadData];
}

نصائح أخرى

كان لدي مشكلة مماثلة سببها استخدام خلايا الارتفاع الديناميكي. كان لدي عرض رأس مخصص قابل للتوسيع ، وعندما كنت أقوم بتحديث TableView لإدراج وإزالة الصفوف المرتبطة بالقسم (وهذا يعني أنهم كانوا يتوسعون ، على التوالي) ، رأس القسم الذي كان فئة فرعية من الفئة الفرعية UITableViewHeaderFooterView لم يتم إعادة تدويرها. لذلك تم تخصيص واحدة جديدة وإضافتها على القديم مما أدى إلى وجهات نظر متداخلة. تم تعيين معرف الخلية بشكل صحيح ، لذلك يجب أن يكون شيئًا آخر. عندما أزلت tableView.sectionHeaderHeight = UITableViewAutomaticDimension وتنفيذها func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat تم إعادة تدوير العرض بشكل صحيح وتم عرض عرض رأس واحد فقط لكل قسم.

حل آخر تحولت إلى العمل بالفعل هو الاستخدام UITableViewCell بدلاً من UITableViewHeaderFooterView وعندما تعود func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? انت فقط return cell.contenView, ، سيعمل هذا لأن الطريقة تتطلب إرجاع UIVIEW ومنذ contentView من uitableviewcell هو Uiview يعمل بشكل جيد. تتمثل الفكرة وراء استخدام آلية إعادة التدوير لـ UitableView من خلال UitableViewCell وإرجاع محتواها بعد تكوينها.

خاتمة. المشكلة من الممكن أن تكون سببها UITableViewHeaderFooterView عندما يتم استخدامها مع خلايا الطاولة ذات التحجيم الذاتي و UITableViewAutomaticDimension بدلا من حساب ارتفاع الخلية يدويا.

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