簡體   English   中英

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 返回duplicate symbol '_vcTabs' (...)

如何將對象添加到其他 class (ExampleMenuViewController.m) 中的現有 NSMutableArray init? 我需要從另一個 class (SomeClass.m) 到 vcTabs (NSMutableArray) 的 append 個新對象。

我在 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]];
    }
}

附言。 如果我從 ExampleMenuViewController 使用,我只有一個選項卡具有最后 object 個屬性...但是additional_tabs數組有 17 個對象。

你有什么想法或建議嗎? 祝大家一切順利!

你什么時候打電話給initVCTabs

SomeClass.m中的代碼何時/如何運行?

作為“Objective-C 和 Swift 編程的初級”,您似乎有很多事情是您還不了解的。 嘗試創建一個新項目並了解其工作原理——然后在您的整個項目中實施它。

這是一個非常非常簡單的例子。 根據您在問題中提供的信息,這可能會或可能不會直接相關 - 但它應該讓您了解 go 的位置:


類.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

一些類.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數組並添加一個 object - @"A"

我們將數組記錄到調試控制台並查看:

vcTabs has 1 objects
A

當您點擊按鈕時,將創建SomeClass的實例,我們調用該 class 中的moreTabs方法,傳遞對vcTabs的引用。 該方法會將 4 個對象添加到數組 - @"B" @"C" @"D" @"E"

然后我們將數組記錄到調試控制台並查看:

vcTabs has 5 objects
A
B
C
D
E

@唐馬格

它正在工作,但我有一個問題要問你。 我添加了 for 循環以增加。 當我添加 [additional_tabs count] 時返回 nil。 為什么這個方法添加相同的對象? 我在 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]];
        
   }
}

你知道如何獲得這個“詞典”或“additional_tabs”嗎? 我試過但總是返回 nil(看起來像一個新的其他實例,而不是這個字典或來自 initFromJSON 的 additional_tabs)。 我只設法使變量 additional_tab_count 返回 17(正確計數),但我寧願從 if 語句中聲明的 additional_tabs 訪問數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM