2016-06-06 8 views
0

Ich scheine ein seltsames Problem zu bekommen, wenn die folgenden nativen iOS Marshalling-Code nativescript:nativescript Rangier Fehler

CGRect keyboardRect = CGRectMake(0, 0, self.view.frame.size.width, 216); 
AGEmojiKeyboardView *emojiKeyboardView = [[AGEmojiKeyboardView alloc] initWithFrame:keyboardRect 
                      dataSource:self]; 
emojiKeyboardView.autoresizingMask = UIViewAutoresizingFlexibleHeight; 
emojiKeyboardView.delegate = self; 
self.textView.inputView = emojiKeyboardView; 

Das Äquivalent kam ich mit ist die folgende:

var keyboardRect = CGRectMake(0, 0, platform.screen.mainScreen.widthPixels, 216); 
var emojiKeyboardView = new AGEmojiKeyboardView(); 
emojiKeyboardView.frame = keyboardRect; 
emojiKeyboardView.autoresizingMask = UIViewAutoresizingFlexibleHeight; 
emojiKeyboardView.delegate = this; 
views.textInput.ios.inputView = emojiKeyboardView; 

wo Plattform ist nur require("platform"); und views.textInput ist eine Ansicht, auf die ich die inputView auf AGEmojiKeyboardView einstellen muss.

Ich verstehe wirklich nicht, wo ich falsch gelaufen bin. Alles, was erscheint, ist eine graue Tastatur ohne Inhalt.

EDIT:

Ich änderte den js Code auf die folgenden:

var keyboardRect = CGRectMake(0, 0, uiView.view.frame.size.width, 216); 
var emojiKeyboardView = new AGEmojiKeyboardView(keyboardRect, uiView); 
emojiKeyboardView.autoresizingMask = UIViewAutoresizingFlexibleHeight; 
emojiKeyboardView.delegate = uiView; 
views.textInput.ios.inputView = emojiKeyboardView; 

wo UIView nur scheint page.ios und etwas ist jetzt geschehen, aber noch nicht das gewünschte Ergebnis. Eine Ausnahme wird ausgelöst, nämlich Folgendes: -[UIViewControllerImpl emojiKeyboardView:imageForSelectedCategory:]: unrecognized selector sent to instance 0x7e6bff60

Antwort

1

Da NativeScript TypeScript als erstklassiges Mitglied hat, ist etwas einfacher mit TS zu tun. Zum Beispiel können Sie auch die verwenden, führen Sie einfach diese zwei Zeilen, um Metadaten & Typings für Ihre CocoaPod (und alle anderen Objective-C-Dateien) zu generieren, und Sie müssen sich nicht um die richtige Syntax kümmern. (Noch müssen Sie kennen die Grundregeln)

TNS_DEBUG_METADATA_PATH="$(pwd)/metadata" tns build ios [--for-device] [--release] 

TNS_TYPESCRIPT_DECLARATIONS_PATH="$(pwd)/typings" tns build ios [--for-device] [--release] 

auch wenn Sie eine benutzerdefinierte Ansicht die beste Variante createa wollen verwendet NativeScript Platzhalter mit creatingView

Was die Syntax es ähnlich wie diese aussehen shouldb aber noch haben Sie Ihre eigene Viewcontroller und wie der Autor sagt erstellen müssen - entsprechen AGEmojiKeyboardViewDataSource und AGEmojiKeyboardViewDelegate Protokoll.

var frame = require('ui/frame'); 
var page; 

function onLoaded(args) { 
    page = args.object; 

} 
exports.onLoaded = onLoaded; 

function onCreatingView(args) { 
    setTimeout(function() { 
     var uiView = page.ios.view; // replace with own UIView and conform to AGEmojiKeyboardViewDataSource and AGEmojiKeyboardViewDelegate protocol. 

     var frame = {origin: {x:0, y:0}, size: {width: uiView.frame.size.width, height:600}}; 
     var emojiView = AGEmojiKeyboardView.alloc().initWithFrameDataSource(frame, uiView); 
     emojiView.autoresizingMask = UIView.UIViewAutoresizing.UIViewAutoresizingFlexibleHeight; 
     emojiView.delegate = uiView; 

     var textContainer = NSTextContainer.alloc().initWithSize({width: 80, height: 180}); 

     var frame = {origin: {x:0, y:0}, size: {width: 100, height:220}}; 
     var textView = UITextView.alloc().initWithFrameTextContainer(frame, textContainer); 
     textView.inputView = emojiView; 

     args.view = textView; 
    }, 500); 
} 
exports.onCreatingView = onCreatingView; 

page.xml

<Page xmlns="http://schemas.nativescript.org/tns.xsd" loaded="onLoaded"> 
    <StackLayout> 
     <Placeholder creatingView="onCreatingView" id="placeholder-view"/> 
    </StackLayout> 
</Page> 
+0

Ich wusste nicht, dass ich die Typoskript-Typings für die Cocoapods generieren konnte. Das ist wirklich interessant, danke für diesen Tipp! Ich werde Ihre Lösung testen und hoffe, dass es funktioniert! – user1494162

+0

Ihr Vorschlag, TNS_METADATA_PATH und TNS_TYPESCRIPT_DECLARATIONS_PATH zu ändern, erzeugt eine doppelte Kennung für alles im Typisierungsordner – RyeGuy

0

Ich könnte mich irren, aber ich denke nicht, dass Sie ordnungsgemäß Marshalling verwenden.

In der Dokumentation:

AGEmojiKeyboardView *emojiKeyboardView = [[AGEmojiKeyboardView alloc] initWithFrame:keyboardRect dataSource:self]; 

So Ihre {N} Version sollte wie folgt sein:

var emojiKeyboardView = AGEmojiKeyboardView.alloc().initWithFrameDataSource(keyboardRect, uiView); 

Dies ist eine große Blog-Post auf, wie Plugins zu erstellen, basierend auf 3rd-Party Bibliotheken für Nationalescript. Außerdem wird Schritt für Schritt erklärt, wie diese Art von Marshalling durchgeführt wird. http://fluentreports.com/blog/?p=167

+0

Hallo, vielen Dank für Ihre Antwort.Ich werde es versuchen und lassen Sie es wissen – user1494162