UITableView หลายตัวเลือก เลือกแถวสุ่มโดยอัตโนมัติด้วยแถวที่เลือก

ฉันมี 30 แถวในมุมมองที่ใช้งานได้ และฉันกำลังพยายามเลือกหลายแถวและตั้งค่าให้ตรวจสอบ

เมื่อใดก็ตามที่ฉันเลือกแถวหนึ่ง แถวอื่นจะถูกเลือกโดยอัตโนมัติและตรวจสอบกับแถวที่ต้องการ

นอกจากนี้เมื่อฉันเลื่อน tableview มันจะเปลี่ยนการเลือกโดยอัตโนมัติ

ฉันใช้โค้ดนี้โดยมีจำนวนแถวน้อยกว่า (8) และทำงานได้อย่างสมบูรณ์แบบ มากกว่า 12 แถวจะทำให้เกิดปัญหาตามที่อธิบายไว้

หากคุณสามารถแนะนำโค้ด/บทช่วยสอนอื่นๆ เพื่อให้มันใช้งานได้ก็ไม่เป็นไร

ฉันยังใหม่กับ xcode ความช่วยเหลือใด ๆ ได้รับการชื่นชมมาก ขอบคุณ

นี่คือรหัสของฉัน:

#pragma mark -
#pragma mark Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
// Return the number of rows in the section.
return [listOfItems count];
}

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

// Configure the cell...
NSString *cellValue = [listOfItems objectAtIndex:indexPath.row];
cell.text = cellValue;

return cell;
}

#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) {

    if(count < 3)
    {

        [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];
        [selectedIndexes addObject:[NSNumber numberWithInt:indexPath.row]];
        count++;
    }

    NSLog(@"Count: %d", count);
    NSLog(@"Items I selected @ %d:", indexPath.row);
    NSLog(@"Items I selected: %@", selectedIndexes);
} 

else {

    [selectedCell setAccessoryType:UITableViewCellAccessoryNone];
    [selectedIndexes removeObject:[NSNumber numberWithInt:indexPath.row]];
    count --;
    NSLog(@"Items I de-selected @ %d:", indexPath.row);

}

[tableView deselectRowAtIndexPath:indexPath animated:NO];

NSMutableString *resultlearning = [[NSMutableString alloc]init];
for (int i = 0; i < [listOfItems count]; i++) {
    NSIndexPath *path = [NSIndexPath indexPathForRow:i inSection:0];
    //[tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:path];
    if (cell.accessoryType == UITableViewCellAccessoryCheckmark) {
        [resultlearning appendFormat:@"%@, ",cell.textLabel.text];
    }
}
if (resultlearning.length > 2) {
    [resultlearning replaceCharactersInRange:NSMakeRange(resultlearning.length-1, 1) withString:@""];
}
NSLog(@"Result: %@",resultlearning);
}

person Sanjyot Shah    schedule 25.07.2012    source แหล่งที่มา


คำตอบ (4)


เพิ่ม mutablearray หนึ่งรายการในไฟล์ .h ที่นี่เพิ่มวัตถุให้อาร์เรย์ได้มากเท่ากับอาร์เรย์ tableDataSourc ของคุณ ตอนนี้ความตั้งใจของฉันคือถ้ามี 0 แสดงว่าเซลล์นั้นไม่ได้ถูกเลือกหรือมี 1 แสดงว่าเซลล์นั้นถูกเลือก

ตอนนี้ทำสิ่งนี้เมื่อคุณเลือกอาร์เรย์ดัชนีแล้วดังนั้นต้องการอาร์เรย์ที่ไม่แน่นอนอื่น:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
for(int i = 0;i<[listOfItems count];i++)
{
[selectedIndexes addObject:@"0"];
}
   return [listOfItems count]
 }


 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

 UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

 if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) {

     [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];
     [selectedIndexes replaceObjectAtIndex:indexPath.row withObject:@"1"];
}
else
{          
selectedCell.accessoryType = UITableViewCellAccessoryNone;
[selectedIndexes replaceObjectAtIndex:indexPath.row withObject:@"0"];
}

ตอนนี้ SelectedIndexes มีวัตถุที่มีค่า 1 หมายความว่าค่านั้นถูกเลือกใน listOfItems

person Paresh Navadiya    schedule 25.07.2012
comment
สวัสดี SelectIndexes จึงเป็นอาร์เรย์ที่ไม่แน่นอนอื่นๆ ที่คุณต้องการให้ฉันประกาศ หรือฉันควรเพิ่มอีกอันหนึ่งนอกเหนือจาก SelectedIndexes หรือไม่ - person Sanjyot Shah; 25.07.2012
comment
คุณไม่จำเป็นต้องเพิ่มอาร์เรย์ที่ไม่แน่นอนอื่นใด เนื่องจากฉันคิดว่าคุณได้เลือกอาร์เรย์ Indexes แล้ว และหากไม่เป็นเช่นนั้น ให้เพิ่มอาร์เรย์ที่ไม่แน่นอนและจัดสรรในวิธี viewDidLoad - person Paresh Navadiya; 26.07.2012

เซลล์จะถูกแคชและนำกลับมาใช้ใหม่ ดังนั้นหากคุณตั้งค่าอุปกรณ์เสริมไว้ที่เซลล์หนึ่งแล้วนำไปใช้กับตำแหน่งอื่นในตาราง อุปกรณ์เสริมก็ยังคงมีอยู่

การติดตามเฉพาะเซลล์ที่ถูกเลือกเป็นข้อมูลในเมธอด didSelectRowAtIndexPath: จะดีกว่า จากนั้นเปิดหรือปิดอุปกรณ์เสริมสำหรับเซลล์ทั้งหมดใน cellForRowAtIndexPath:

person Phillip Mills    schedule 25.07.2012
comment
โอเค คุณหมายถึงว่าฉันควรเก็บดัชนีไว้ในอาร์เรย์ แล้วใช้อาร์เรย์เพื่อเปิดหรือปิดอุปกรณ์เสริมใช่ไหม คุณช่วยสาธิตการใช้บล็อคโค้ดหน่อยได้ไหม? - person Sanjyot Shah; 25.07.2012
comment
หรือถ้าคุณสามารถแก้ไขได้ในโพสต์ของฉันที่จะดีมาก ขอบคุณและขออภัยสำหรับปัญหา ฉันยังใหม่กับ xcode - person Sanjyot Shah; 25.07.2012

ตรรกะของการตรวจสอบ/ยกเลิกการเลือกประเภทอุปกรณ์เสริมของเซลล์ควรไปที่ cellForRowAtindexPath ใน DidSelectRowAtIndexPath คุณควรดูแลแถวที่เลือกเท่านั้น

person Apurv    schedule 25.07.2012

อืม...เช้านี้ฉันยังดื่มกาแฟแก้วแรกอยู่ แต่มีบางอย่างบอกฉันว่าคุณมีแถว "เลือก" แล้ว เมื่อเรียก DidSelectRowAtIndexPath ดูเหมือนว่าคำสั่ง if อาจกำลังทำอะไรแปลกๆ และเลือกแถวถัดไปหรืออะไรบางอย่าง คุณได้ลองแสดงความคิดเห็นในคำสั่ง if แล้วหรือยัง? ฉันรู้ว่าอาจจะเลือกได้ทีละรายการเท่านั้น แต่เพื่อดูว่าเป็นสาเหตุหรือไม่ แล้วแถวถัดไปที่ถูกเลือกคือแถวก่อนหน้าหรือเปล่า?

person Indy-Jones    schedule 25.07.2012
comment
ฉันพยายามแสดงความคิดเห็น ไม่มีแถวที่เลือกไว้ล่วงหน้า และไม่ ไม่ใช่แถวที่เลือกไว้ก่อนหน้านี้ นอกจากนี้การเลือกจะเปลี่ยนโดยอัตโนมัติเมื่อฉันเลื่อนลงหรือขึ้นและกลับไปดูการเลือก ฉันคิดว่ามีข้อบกพร่องสำคัญในตรรกะของฉัน หากคุณสามารถแนะนำตรรกะหรือรหัสอื่น ๆ ได้ก็ไม่เป็นไร สิ่งที่ฉันต้องการทำคือมี 30 แถวในตารางของฉันและสามารถเลือกได้สูงสุด 3 จาก 30 แถว และใช้การตรวจสอบกับแถวที่เลือกและจัดเก็บแถวตรวจสอบไว้ในตัวแปรสตริงเดียว - person Sanjyot Shah; 25.07.2012