Objective-C 如何从其他地方添加对象到NSMutableArray?

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

你好,我是 Objective-C 和 Swift 编程的大三学生。

我在 ExampleMenuViewController.m 或(和)SomeClass.m 中声明了 NSMutableArray 为 vcTabs。

NSMutableArray *vcTabs;

当我有两个声明时 'vcTabs' Xcode returns duplicate symbol '_vcTabs' (...)

如何将对象添加到其他 class (ExampleMenuViewController.m) 中的现有 NSMutableArray init? 我需要将另一个 class (SomeClass.m) 的新对象附加到 vcTabs (NSMutableArray)。

我在SomeClass.m中写了这段代码:

 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);
            }
        }

带有 initVCTabs 的 ExampleMenuViewController 方法

- (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。如果我从 ExampleMenuViewController 使用,我只有一个带有最后一个对象属性的选项卡...但是 additional_tabs 数组有 17 个对象。

您有什么想法或建议吗? 祝大家一切顺利!

你什么时候打电话给 initVCTabs

SomeClass.m运行中的代码什么时候/怎么样?

作为 "Objective-C 和 Swift 编程的初级人员",你似乎有很多事情还不明白。尝试创建一个新项目并了解它是如何工作的——然后在您的整个项目中实施它。

这是一个非常非常简单的例子。根据您在问题中提供的信息,这可能会或可能不会直接相关 - 但它应该让您知道去哪里:


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

ExampleMenuViewController加载时,它会在视图的中心添加一个按钮,然后实例化vcTabs数组并添加一个对象-@"A".

我们将数组记录到调试控制台并查看:

vcTabs has 1 objects
A

当您点击按钮时,将创建 SomeClass 的实例,我们调用 class 中的 moreTabs 方法,传递对 vcTabs 的引用。该方法会将 4 个对象添加到数组 - @"B" @"C" @"D" @"E".

然后我们将数组记录到调试控制台并查看:

vcTabs has 5 objects
A
B
C
D
E

@DonMag

它正在运行,但我有一个问题要问你。我添加了 for 循环以增加。当我添加 [additional_tabs count] 时 return nil。为什么这个方法添加相同的对象?我在 addMore 函数中的代码:

- (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]];
        
   }
}

你知道如何获得这本“词典”或“additional_tabs”吗?我试过了,但总是 return nil(看起来像一个新的其他实例,不是这个字典或来自 initFromJSON 的 additional_tabs)。我只设法使变量 additional_tab_count 并且它是 return 17(正确计数),但我宁愿访问来自 if 语句中声明的 additional_tabs 的数组。