【问题标题】:Objective-C How to add objects to NSMutableArray from other place?Objective-C 如何从其他地方将对象添加到 NSMutableArray?
【发布时间】:2020-12-18 17:10:15
【问题描述】:

您好,我是 Objective-C 和 Swift 编程的初级人员。

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

NSMutableArray *vcTabs;

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

如何将对象添加到其他类(ExampleMenuViewController.m)中的现有 NSMutableArray init? 我需要将另一个类 (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 个对象。

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

【问题讨论】:

    标签: ios objective-c xcode nsarray nsdictionary


    【解决方案1】:

    你什么时候打电话给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 的实例,我们在该类中调用moreTabs 方法,传递对vcTabs 的引用。该方法将向数组中添加 4 个对象 - @"B" @"C" @"D" @"E"

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

    vcTabs has 5 objects
    A
    B
    C
    D
    E
    

    【讨论】:

    • 感谢您的课程。太棒了。我创建了新项目。后来我将它实现到一个更大的应用程序中,它就像你说的那样工作。我的initVCTabs 是从 ExampleMenuViewController 中的 viewDidLoad 调用的。在 SomeClass 我有一些方法,比如- (id)initFromJSON:(NSDictionary *)dictionary当然还有 -(void)moreTabs:(NSMutableArray)a。
    • 我在更大的帖子中给你答案。
    【解决方案2】:

    @DonMag

    它有效,但我有一个问题要问你。我添加了for循环来增加。当我添加 [additional_tabs count] 时返回 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]];
            
       }
    }
    

    您知道如何获取此“字典”或“附加标签”吗?我试过但总是返回 nil(看起来像一个新的其他实例,不是这个字典或来自 initFromJSON 的附加标签)。我只设法创建了变量 additional_tab_count,它返回 17(正确计数),但我宁愿从 if 语句中声明的 additional_tabs 访问数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多