2012-05-02 10 views
7

में एक बटन दबाकर एक UITableView को गतिशील रूप से पंक्ति/कक्ष कैसे जोड़ें, प्रारंभ में मेरे पास केवल एक ऐड बटन वाला टेबल व्यू है।आईफोन

जब उपयोगकर्ता प्रेस इस बटन को मैं कोशिकाओं को बढ़ा देते गिनती और के रूप में

पंक्ति संख्या और कैसे जोड़ें बटन पर क्लिक करके नई पंक्तियाँ जोड़ने के लिए लिखने के लिए कैसे इस प्रकार की कोशिकाओं को जोड़ने की आवश्यकता

// पंक्ति गिनती

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return **????** ; 
} 

// कोशिकाओं पर सामग्री/पंक्तियों

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
     ?????? 
} 

// ### अग्रिम में नई पंक्ति .. जोड़े ###

-(IBAction)myAction:(id)sender 
{ 
    ???????? ; 
} 

धन्यवाद ...

+2

असल में आप उन्हें दृश्य में नहीं जोड़ते हैं, बल्कि मॉडल के लिए भी जोड़ते हैं। ऐसा करने के बाद, टेबलव्यू रीलोड लोडडेटा विधि आपका मित्र है – HeikoG

उत्तर

7

आपके आवेदन आप सरणी के लिए मान जोड़ने के लिए जब आप btn में क्रिया करने के लिए है में।

उदाहरण के लिए आपके टेबलव्यू में आप सेल.textLABEL.text में एनएसएसटींग प्रदर्शित कर रहे हैं। ये स्ट्रिंग्स एनएसएमयूटेबलएरे में हैं।

अब जब buttonAction myAction में

कहा जाता है

{ 
    NSString *newString [email protected]"NEW CELL"; 

    [tableArray addObject:newString]; 
    [tableView reloadData]; 
} 

इस तर्क अपने आवेदन में अपने मॉडल के बारे में की कोशिश करो।

मुझे आशा है कि यह तर्क आपके लिए सहायक होगा।

+0

हां यह पूरी तरह से काम करता है \ – Ranga

+2

यह काम करेगा, लेकिन यह प्रदर्शन गिरावट की ओर जाता है। एक नया सेल पुनः लोड करने के लिए पूरे UITableview को गैर-समझदारी है। –

+3

नवीन के लिए सहमत हुए। इसके बजाय insertRowsAtIndexPaths का उपयोग करें – MANN

11

UITableView पंक्ति या खंड डालने के लिए संपत्ति है। देखें Apple Doc

इस पर कई ट्यूटोरियल हैं। पंक्ति/अनुभाग जोड़ने/हटाने के लिए 2 सामान्यतः उपयोग होते हैं।

insertRowsAtIndexPaths:withRowAnimation: 
deleteRowsAtIndexPaths:withRowAnimation: 

मैं इसी तरह जवाब पोस्ट किया है कि यह कैसे उपयोग करने के लिए: Hiding the table view cells with switch ON/OFF in iPhone

+0

आपका ट्यूटोरियल लिंक सर लोड नहीं करता है कृपया अपडेट किए गए लिंक को पोस्ट करें। यह ओप्स त्रुटि दिखाता है। आपकी त्वरित प्रतिक्रिया – Ranga

+0

के लिए किसी भी तरह से आपको बहुत धन्यवाद, इसे आजमाएं: http: //stackoverflow.com/questions/9339186/hiding-the-table-view-cells-with-switch-on-off-in-iphone – HelmiB

0

आप केवल सरणी में ऑब्जेक्ट जोड़ सकते हैं और बटन क्लिक पर अपनी टेबलव्यू पुनः लोड कर सकते हैं। हर बार जब आप जोड़ सकते हैं या पंक्ति निकालना चाहते देखने तालिका के

[array addobject:@""]; 
[tableview reloaddata]; 
7

पुन: लोड आपके आवेदन के उपयोगकर्ता के लिए गरीब अनुभव बनाता है। इस तथ्य के बावजूद कि यह कार्य करने के लिए यह प्रभावी तरीका नहीं है, इसके कुछ नकारात्मक साइड इफेक्ट्स भी हैं - चयनित पंक्तियों को पुनः लोड करने के बाद चयनित नहीं किया जाता है और परिवर्तन एनिमेटेड नहीं होता है।

UITableView में विधियां हैं जो तालिका दृश्य की सामग्री को गतिशील रूप से बदलने के लिए बनाई गई हैं।ये हैं:

insertRowsAtIndexPaths:withRowAnimation: 
moveRowAtIndexPath:toIndexPath: 
deleteRowsAtIndexPaths:withRowAnimation: 

सूचना है कि इन तरीकों आप जो निर्दिष्ट आपरेशन किया जाता है का उपयोग किया जाएगा एनीमेशन की तरह निर्दिष्ट कर सकते हैं - जब आप reloadData का उपयोग तालिका दृश्य की सामग्री को संशोधित करने के लिए आप इस तरह का व्यवहार हासिल नहीं कर सकते ।

इसके अलावा, आप भी (यह आवश्यक नहीं है) एक से अधिक तालिका दृश्य तालिका दृश्य के अतिरिक्त तरीकों का उपयोग कर संचालन गठजोड़ कर सकते हैं:

beginUpdates endUpdates

बस संचालन आप beginUpdates के लिए कॉल में प्रदर्शन करने के लिए चाहते हैं लपेट और endUpdates विधियों और तालिका दृश्य एक एनीमेशन beginUpdates और endUpdates कॉल के बीच अनुरोध किए गए सभी परिचालनों के लिए एनीमेशन बनाएंगे ताकि पूरा संक्रमण कुछ अलग एनिमेशंस द्वारा बनाए गए अच्छे को देख सके।

[self.tableView beginUpdates] 
//calls to insert/move and delete methods 
[self.tableView endUpdates] 

यह आप डेटा स्रोत राज्य UITableView द्वारा रखा एक के अनुरूप रखने के लिए वास्तव में महत्वपूर्ण है। इस कारण से आपको आश्वस्त करना होगा कि जब तालिका दृश्य अनुरोधित संचालन करने के लिए शुरू होता है तो उसका डेटा स्रोत सही मान वापस कर देगा।

[self.tableView beginUpdates] 
//calls to insert/move and delete methods 
//operations on our data source so that its 
//state is consistent with state of the table view 
[self.tableView endUpdates] 

जब तालिका दृश्य संचालन करने लगते हैं? यह इस बात पर निर्भर करता है कि ऑपरेशन एनीमेशन ब्लॉक में beginUpdates और endUpdates विधियों द्वारा परिभाषित किया गया है या नहीं। यदि हां, तो तालिका दृश्य endUpdates विधि कॉल के बाद संचालन करने लगता है। अन्यथा, तालिका दृश्य डालने/स्थानांतरित करने या हटाने के लिए कॉल के ठीक बाद ऑपरेशन करता है।

आप beginUpdates और endUpdates तरीकों का उपयोग कर रहे हैं आप को पता है कि इस मामले तालिका दृश्य में, बैचों 'का अनुरोध संचालन और उन्हें विशिष्ट क्रम जो कॉल के आदेश के रूप में ही आवश्यक नहीं है में प्रदर्शन किया है तालिका दृश्य पर कार्रवाई करने आपने अपनी टेबल व्यू ऑब्जेक्ट (Apple's documentation on this topic) पर बनाया है।

याद रखने की सबसे महत्वपूर्ण बात यह है कि सभी परिचालनों को हटाने से सभी परिचालन संचालन से पहले हमेशा किया जाता है। इसके अलावा, विलोपन ऑपरेशन अवरोही क्रम (इंडेक्स 3, 2, 1 के लिए संचालन) में किया जाता है जब सम्मिलन ऑपरेशन आरोही क्रम में किया जाता है (इंडेक्स 1, 2, 3 के लिए संचालन)। इसके बारे में याद रखें महत्वपूर्ण तालिका डेटा द्वारा रखे गए डेटा के साथ आपके डेटा स्रोत को बनाए रखने में महत्वपूर्ण है।

नीचे दिए गए उदाहरण में प्रस्तुत किए गए डेटा स्रोत और तालिका दृश्य पर संचालन के क्रम का विश्लेषण करने पर कुछ समय व्यतीत करें।

अंतिम उदाहरण:

//initial state of the data source 
self.numbers = [@[@(0), @(1), @(2), @(3), @(4), @(5), @(6)] mutableCopy]; 
// 
//... 
// 

NSArray indexPathsToRemove = @[[NSIndexPath indexPathForRow:3 section:0]. 
           [NSIndexPath indexPathForRow:0 section:0]; 
NSArray indexPathsToAdd = @[[NSIndexPath indexPathForRow:6 section:0], 
          [NSIndexPath indexPathForRow:5 section:0]]; 

[self.tableView beginUpdates]; 

[self.numbers removeObjectAtIndex:3]; 
[self.numbers removeObjectAtIndex:0]; 

[self.numbers insertObject:@(10) atIndex:4]; 
[self.numbers insertObject:@(11) atIndex:5]; 

[self.tableView insertRowsAtIndexPaths:indexPathsToAdd withRowAnimation:UITableViewRowAnimationAutomatic]; 
[self.tableView deleteRowsAtIndexPaths:indexPathsToRemove withRowAnimation:UITableViewRowAnimationAutomatic]; 

[self.tableView endUpdates]; 
//final state of the data source ('numbers') - 1, 2, 4, 5, 6, 10, 11 
2

वहाँ अन्य सही जवाब यहाँ हैं (जो आप पढ़ना चाहिए, क्योंकि वे में गहराई से आगे जाना), लेकिन मैं सब समाधान मैं कर सकता पढ़ने के बाद इस के साथ एक सप्ताह से अधिक के लिए संघर्ष ढूंढें क्योंकि व्यापक उदाहरणों के साथ कोई भी (जो मैंने पाया!) नहीं थे। इस के लिए

नियम काम करने के लिए: 1. परिवर्तन सरणी कि आइटम आप UITableView में प्रदर्शित कर रहे हैं शामिल करने के लिए सीधे किया जाना चाहिए।यदि tableView:cellForRowAtIndexPath: में UITableViewCell में में समान मानों के लिए UITableViewCell में कुछ मान सेट करते हैं, तो इन विधियों को काम करने के लिएभी पर परिवर्तनों कोपर बदलना चाहिए। tableView में प्रदर्शित वस्तुओं की सरणी

  1. परिवर्तन[tableView beginUpdates] और [tableView endUpdates]
  2. indexPaths सरणी की गिनती के बीच में बनाया जाना चाहिए आप अतिरिक्त आइटम 'की गिनती के बराबर होना चाहिए तालिका दृश्य में जोड़ना (मुझे लगता है कि यह स्पष्ट है, लेकिन यह इंगित करने में कोई दिक्कत नहीं होती है)

यहां एक बहुत ही सरल उदाहरण है जो स्वयं पर काम करेगा।

@interface MyTableViewController() 
@property (nonatomic, strong) NSMutableArray *expandableArray; 
@property (nonatomic, strong) NSMutableArray *indexPaths; 
@property (nonatomic, strong) UITableView *myTableView; 
@end 

@implementation MyTableViewController 

- (void)viewDidLoad 
{ 
    [self setupArray]; 
} 

- (void)setupArray 
{ 
    self.expandableArray = @[@"One", @"Two", @"Three", @"Four", @"Five"].mutableCopy; 
} 

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return self.expandableArray.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    //here you should create a cell that displays information from self.expandableArray, and return it 
} 

//call this method if your button/cell/whatever is tapped 
- (void)didTapTriggerToChangeTableView 
{ 
    if (/*some condition occurs that makes you want to expand the tableView*/) { 
     [self expandArray] 
    }else if (/*some other condition occurs that makes you want to retract the tableView*/){ 
     [self retractArray] 
    } 
} 

//this example adds 1 item 
- (void)expandArray 
{ 
    //create an array of indexPaths 
    self.indexPaths = [[NSMutableArray alloc] init]; 
    for (int i = theFirstIndexWhereYouWantToInsertYourAdditionalCells; i < theTotalNumberOfAdditionalCellsToInsert + theFirstIndexWhereYouWantToInsertYourAdditionalCells; i++) { 
     [self.indexPaths addObject:[NSIndexPath indexPathForRow:i inSection:0]]; 
    } 

    //modify your array AND call insertRowsAtIndexPaths:withRowAnimation: INBETWEEN beginUpdates and endUpdates 
    [self.myTableView beginUpdates]; 
    //HERE IS WHERE YOU NEED TO ALTER self.expandableArray to have the additional/new data values, eg: 
    [self.expandableArray addObject:@"Six"]; 
    [self.myTableView insertRowsAtIndexPaths:self.indexPaths withRowAnimation:(UITableViewRowAnimationFade)]; //or a rowAnimation of your choice 

    [self.myTableView endUpdates]; 
} 

//this example removes all but the first 3 items 
- (void)retractArray 
{ 
    NSRange range; 
    range.location = 3; 
    range.length = self.expandableArray.count - 3; 

    //modify your array AND call insertRowsAtIndexPaths:withRowAnimation: INBETWEEN beginUpdates and endUpdates 
    [self.myTableView beginUpdates]; 
    [self.expandableArray removeObjectsInRange:range]; 
    [self.myTableView deleteRowsAtIndexPaths:self.indexPaths withRowAnimation:UITableViewRowAnimationFade]; //or a rowAnimation of your choice 
    [self.myTableView endUpdates]; 
} 

@end 

मुझे उम्मीद है कि यह किसी को बहुत समय और सिरदर्द बचाता है। यदि आप इसे इस तरह करते हैं, तो आपको इसे अपडेट करने के लिए संपूर्ण तालिका दृश्य को पुनः लोड करने की आवश्यकता नहीं है, और आप इसके लिए एक एनीमेशन चुनने में सक्षम हैं। मुफ्त कोड, इसे दस्तक मत करो।

+0

मेरे पास कुछ समान परिदृश्य है। मेरे पास 76 ऑब्जेक्ट्स (लगभग) के साथ सरणी है। जबकि टेबलव्यू पॉप्युलेटिंग, टेबल एक समय में केवल 10 कोशिकाओं को दिखा सकता है। पहले 0-10 ऑब्जेक्ट्स को अगली बटन तालिका पर दबाकर 11-20 डेटा, फिर 21-30 और इतने पर दिखाना चाहिए ... तो मैं ऐसा कैसे कर सकता हूं? क्या आपको इसके बारे में कोई विचार है? – Moxarth