Ausgabe
- Beachten Sie, dass ich mit React Native für macOS arbeite
Ich habe (eigentlich nicht vollständig) ein Modul erstellt , das NSOpenPanel und NSSavePanel überbrückt . Hier ist meine RCTPanel.m
:
#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
#import "RCTPanel.h"
@implementation RCTPanel
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(open)
{
NSOpenPanel *panel;
if ([panel runModal] == NSModalResponseOK)
{
// TODO
}
}
RCT_EXPORT_METHOD(save)
{
NSSavePanel *panel;
if ([panel runModal] == NSModalResponseOK)
{
//TODO
}
}
und hier ist mein Testcode App.tsx
:
import React from 'react';
import { Button, NativeModules, View } from "react-native";
export default class App extends React.Component {
render() {
return (
<View>
<Button title='OPEN' onPress={ () => NativeModules.Panel.open() }/>
<Button title='SAVE' onPress={ () => NativeModules.Panel.save() }/>
</View>
);
}
}
Wenn ich starte npx react-native run-macos
, wird die App gut angezeigt, aber wenn ich Tasten drücke, die ich erstellt habe, wird das Öffnen/Speichern-Bedienfeld nicht angezeigt. keine Fehlermeldung.
Ich dachte zuerst , Microsoft zu fragen (das React-Native-Macos pflegt),
aber es scheint kein Fehler zu sein. eher mein Fehler. deswegen frage ich hier.
Lösung
NSOpenPanel *panel;
if ([panel runModal] == NSModalResponseOK)
{
// TODO
}
Beachten Sie, dass Ihre erste Zeile nur eine panel
Variable bezeichnet und nicht das Panel selbst erstellt. Beim manuellen Referenzzählen wäre es ein Junk-Zeiger (nicht initialisiert), kann sich aber nil
in ARC befinden. In jedem Fall wird das Senden der -runModal
Nachricht an nil
einfach ignoriert und es passiert nichts, was das von Ihnen beschriebene Verhalten ist.
Ändern Sie die Zeilen in NSOpenPanel *panel = [NSOpenPanel openPanel];
und NSSavePanel *panel = [NSSavePanel savePanel];
und sie sollten ordnungsgemäß funktionieren.
Wenn in Objective-C die Dinge nicht so laufen, wie sie sollten, ist es immer eine gute Idee, zu überprüfen, ob ein Wert, von dem Sie glauben, dass er existiert, tatsächlich nicht nil
.
Beantwortet von – NSGod
Antwort geprüft von – David Marino (FixError Volunteer)