【问题标题】:erros using contextInfo with NSAlertPanel and ARC to pass data使用带有 NSAlertPanel 和 ARC 的 contextInfo 传递数据时出错
【发布时间】:2026-01-26 03:20:07
【问题描述】:

这个问题的答案可能很简单,但目前我很困惑,欢迎任何帮助。

我已将上下文菜单附加到表格视图。菜单选项之一是删除表格视图中的元素。我正在使用 NSAlert 弹出模式窗口以确认删除。我想将 tableview 中的值传递给警报选择器,因此我有一些参考可用于删除。 这是警报字符串:

    [alert beginSheetModalForWindow:_window
        modalDelegate:self
        didEndSelector:@selector(deleteAlert:code:context:)
        contextInfo:s]; 

每当我尝试将对象作为 contextInfo 传递时,都会收到警告。如果我尝试传递 NSInteger 行(来自 tableview 的行),我会收到此编译器警告:警告:语义问题:不兼容的整数到指针转换将“NSInteger”(又名“long”)发送到“void *”类型的参数 如果我尝试以变量名形式传递字符串,我会得到:错误:自动引用计数问题:ARC 不允许将 Objective-C 指针隐式转换为“void *”。我还尝试了一本字典,但没有任何运气。

但是,如果我传递这样的字符串:contextInfo:@"some info",我不会收到任何错误,而且我实际上可以在选择器中看到它。这当然对我的需求有点用处。

那么,如何将表格行信息传递到警报中,以便在删除选择器中使用它?

【问题讨论】:

    标签: cocoa


    【解决方案1】:

    如果要传递行索引,可以将其包装在NSNumber 实例中:

    [alert beginSheetModalForWindow:_window modalDelegate:self didEndSelector:@selector(deleteAlert:code:context:) contextInfo:(__bridge void *)[NSNumber numberWithInteger:row]];
    

    【讨论】:

    • 感谢您的快速帮助,但我仍然收到相同的错误错误:自动引用计数问题:ARC 不允许将 Objective-C 指针隐式转换为 'void *' [alert beginSheetModalForWindow:_window modalDelegate :self didEndSelector:@selector(deleteAlert:code:context:) contextInfo:[NSNumber numberWithInteger:row]];
    • 我忘了重要的部分是__bridge cast。
    • 谢谢。 __bridge 演员表有效,但现在我在将 NSNumber 解包回整数时遇到了问题。 contextInfo 被标记为 targetRow。此代码因错误的接收者类型无效而失败。 code NSInteger 影响行 = [targetRow integerValue]; code 现在我想取出 row 变量,以便在查找数组时使用它:code [printerNames objectAtIndex:affectedRow] code 感谢您的帮助。
    • 你可以这样弄出来:NSInteger row = [(__bridge NSNumber *)targetRow integerValue]