简体   繁体   中英

Objective-C How to add objects to NSMutableArray from other place?

Hello I'm junior in Objective-C and Swift programming.

I have NSMutableArray in ExampleMenuViewController.m or(and) SomeClass.m declared as vcTabs.

NSMutableArray *vcTabs;

When I have two declares 'vcTabs' Xcode returns duplicate symbol '_vcTabs' (...)

How to add objects to an existing NSMutableArray init in other class (ExampleMenuViewController.m)? I need append new objects from another class (SomeClass.m) to vcTabs (NSMutableArray).

I wrote in SomeClass.m this code:

 if ([Tools isNonullValueForKey:[dictionary valueForKey:@"additional_tabs"]]) {
        additional_tabs = [dictionary valueForKey:@"additional_tabs"];
            
            NSLog(@"additionalTabs count: %lu", [additional_tabs count]);
            
            for (int i = 0; i < [additional_tabs count]; i++) {
                 
                 if ([Tools isNonullValueForKey:[additional_tabs valueForKey:@"_id"]]) {
                     additional_tab_id = [[additional_tabs valueForKey:@"_id"] objectAtIndex:i];
                 }
                     
                 if ([Tools isNonullValueForKey:[additional_tabs valueForKey:@"names"]]) {
                     NSDictionary *dic = [[additional_tabs valueForKey:@"names"] objectAtIndex:i];
                     _en_additional_tab_name = [dic valueForKey:@"en"];
                     _pl_additional_tab_name = [dic valueForKey:@"pl"];
                 }
                     
                 if ([Tools isNonullValueForKey:[additional_tabs valueForKey:@"url"]]) {
                     additional_tab_url = [[additional_tabs valueForKey:@"url"] objectAtIndex:i];
                     //NSLog(@"additional_tab_url: %@", _additional_tab_url);
                 }
                
                [vcTabs addObject:[[VCTab alloc] initWithIdAndTypeAndUrl:additional_tab_id :VCTabAdditional :additional_tab_url]];
                NSLog(@"%@ %d %@ %@ %@ %@", @"pos", i,  @"id: ", additional_tab_id, @"url: ", additional_tab_url);
            }
        }

ExampleMenuViewController method with initVCTabs

- (void)initVCTabs {
    vcTabs = [[NSMutableArray alloc] init];
    
    [vcTabs removeAllObjects];
    
     if ([Tools getBooleanUserDefault:@"example_visible_tab_attendees" :YES]) {
        [vcTabs addObject:[[VCTab alloc] initWithType:VCTabAttendees]];
    }

    (...)

     if ([Tools getBooleanUserDefault:@"example_visible_tab_user_info" :YES]) {
        [vcTabs addObject:[[VCTab alloc] initWithType:VCTabUserInfo]];
    }
    
    if ([Tools getStringUserDefault:@"example_additional_tab_id" :@""]) {
        NSString *additionalTabId = [Tools getStringUserDefault:@"conference_additional_tab_id" :@""];
        NSString *additionalTabUrl = [Tools getStringUserDefault:@"conference_additional_tab_url" :@""];
        NSLog(@"additionalTabId %@", additionalTabId);
        NSLog(@"additionalTabUrl %@", additionalTabUrl);
        [vcTabs addObject:[[VCTab alloc] initWithIdAndTypeAndUrl:additionalTabId :VCTabAdditional :additionalTabUrl]];
    }
}

PS. If I use from ExampleMenuViewController I have only one tab with last object properties... but additional_tabs array have 17 objects.

Do you have any ideas or advices? All the best for you everyone!

When are you calling initVCTabs ?

When / how is the code in SomeClass.m running?

For being a "junior in Objective-C and Swift programming" you seem to have a lot going on that you don't understand yet. Try creating a new project and learn how things work -- then implement that in your full project.

Here is a very, very simple example. With the information you provided in your question, this may or may not relate directly - but it should give you an idea of where to go:


SomeClass.h

//  SomeClass.h
//  Created by Don Mag on 8/30/20.

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface SomeClass : NSObject
- (void)moreTabs:(NSMutableArray *)a;
@end

NS_ASSUME_NONNULL_END

SomeClass.m

//  SomeClass.m
//  Created by Don Mag on 8/30/20.

#import "SomeClass.h"

@interface SomeClass()

@end

@implementation SomeClass

- (void)moreTabs:(NSMutableArray *)a {
    [a addObject:@"B"];
    [a addObject:@"C"];
    [a addObject:@"D"];
    [a addObject:@"E"];
}

@end

ExampleMenuViewController.h

//  ExampleMenuViewController.h
//  Created by Don Mag on 8/30/20.

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface ExampleMenuViewController : UIViewController

@end

NS_ASSUME_NONNULL_END

ExampleMenuViewController.m

//  ExampleMenuViewController.m
//  Created by Don Mag on 8/30/20.

#import "ExampleMenuViewController.h"
#import "SomeClass.h"

@interface ExampleMenuViewController ()
{
    NSMutableArray *vcTabs;
}

@end

@implementation ExampleMenuViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // add a button to the view
    //UIButton *b = [UIButton new];
    UIButton *b = [UIButton buttonWithType:UIButtonTypeSystem];
    [b setTitle:@"Tap Me" forState:UIControlStateNormal];
    b.frame = CGRectMake(0, 0, 200, 50);
    b.center = self.view.center;
    [self.view addSubview:b];
    [b addTarget:self action:@selector(btnTapped) forControlEvents:UIControlEventTouchUpInside];
    
    [self initVCTabs];
    [self logArray];
}

- (void)initVCTabs {
    // instantiate NSMutableArray
    vcTabs = [NSMutableArray new];
    // add one object
    [vcTabs addObject:@"A"];
}
- (void)btnTapped {
    SomeClass *sc = [SomeClass new];
    [sc moreTabs:vcTabs];
    [self logArray];
}
- (void)logArray {
    NSLog(@"vcTabs has %ld objects", [vcTabs count]);
    for (NSString *s in vcTabs) {
        NSLog(@"%@", s);
    }
}

@end

When ExampleMenuViewController loads, it will add a button to the center of the view, then instantiate the vcTabs array and add one object - @"A" .

We log the array to the debug console and see:

vcTabs has 1 objects
A

When you tap the button, an instance of SomeClass will be created, we call the moreTabs method in that class, passing a reference to vcTabs . That method will add 4 objects to the array - @"B" @"C" @"D" @"E" .

We then log the array to the debug console and see:

vcTabs has 5 objects
A
B
C
D
E

@DonMag

It's working but I have one question to you. I added for loop to increment. When I add [additional_tabs count] is return nil. Why this method adds the same objects? My code in addMore function:

- (void)moreTabs:(NSMutableArray *)a {
        
    for (int i = 1; i < additional_tab_count; i++) {
    NSString *additionalTabId = [Tools getStringUserDefault:@"conference_additional_tab_id" :@""];
    NSString *additionalTabUrl = [Tools getStringUserDefault:@"conference_additional_tab_url" :@""];
    [a addObject:[[VCTab alloc] initWithIdAndTypeAndUrl:additionalTabId :VCTabAdditional :additionalTabUrl]];
        
   }
}

Do you know how to get THIS "dictionary" or "additional_tabs". I tried but always return nil (looks like a new other instance and is not this dictionary or additional_tabs from initFromJSON). I only managed to make variable additional_tab_count and it's return 17 (correct count), but I'd rather have access to array from additional_tabs declared in if statements.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM