【问题标题】:Set viewController shared public object设置 viewController 共享公共对象
【发布时间】:2020-05-05 14:56:44
【问题描述】:

我有包含tableViewViewController 和要在该表上显示的一组项目。

为了更改表格内容,我可以初始化数组并从 ViewController 按钮回调中调用 reloadData 方法(参见下面的buttonTap 方法)。

但是,我还需要从viewController 范围之外的外部代码更改表格内容,但无法访问。

在下面的最小示例中,我正在使用基于外部 C/C++ 的线程,该线程未成功尝试访问 viewController 方法,但由于 No known class method for selector 'changeArr' 而编译失败

知道如何公开 viewController 吗?

viewController.m

#import "ViewController.h"

@interface ViewController() <NSTableViewDelegate, NSTableViewDataSource>

@property (weak) IBOutlet NSTableView *tableView;
@property NSMutableArray<NSString*> * arr;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.delegate = self;
    self.tableView.dataSource = self;

    [self.tableView reloadData];
}

- (void)viewWillAppear {
    [super viewWillAppear];

    [self.tableView reloadData];
}

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
    return self.arr.count;
}

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

    NSTableCellView* cellView =(NSTableCellView*)[tableView makeViewWithIdentifier:@"cell1" owner:nil];
    cellView.textField.stringValue = self.arr[row];
    return cellView;
}

-(void)changeArr {
    self.arr = [NSMutableArray arrayWithObjects:@"ccc", @"ddd", nil];
    [self.tableView reloadData];
    NSLog(@"fwefwe");
}

- (IBAction)buttonTap:(id)sender {

    self.arr = [NSMutableArray arrayWithObjects:@"AAAA", @"BBB", nil];
    [self.tableView reloadData];
}

main.m

#import <Cocoa/Cocoa.h>
#include <pthread.h>
#import "ViewController.h"

void updateTable() {
    sleep(10);    
    dispatch_sync(dispatch_get_main_queue(), ^{ [ViewController changeArr]; });  // ERROR : No known class method for selector 'changeArr'
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // Setup code that might create autoreleased objects goes here.
    }

    pthread_t threadHandler;
    pthread_create(&threadHandler, NULL, &updateTable, NULL);

    return NSApplicationMain(argc, argv);
}

【问题讨论】:

  • Objective-C 是与 C++ 截然不同的语言。
  • 考虑到你想要做的如何,从here开始对你很有帮助

标签: c++ objective-c macos uitableview uiviewcontroller


【解决方案1】:

changeArr 是一个私有函数(-)。所以你不能打电话给[ViewController changeArr]。 如果将changeArr 更改为公共函数(+),则无法访问内部数组。 所以我认为完成这项任务的简单方法是通过单音使用ViewController 的实例。

    ...
    @implementation ViewController
    + (id) sharedViewController {
        static ViewController *sharedInstance = nil;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
            sharedInstance = [storyboard instantiateViewControllerWithIdentifier:@"MyViewControllerIdentifier"];
        });
        return sharedInstance ;
    }

   - (void)viewDidLoad {
    [super viewDidLoad];
   ...

在更新表中:

dispatch_sync(dispatch_get_main_queue(), ^{ [[ViewController sharedViewController]  changeArr]; });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    相关资源
    最近更新 更多