2016-04-06 30 views
0

Swift 2 ve Xcode 7'yi kullanarak bir Mac uygulaması geliştiriyorum.XCode neden 'tanınmayan bir seçici' hatası veriyor?

Swift ile bir kaç yıl çalıştıktan sonra Swift ile çalışmaya başladım.

Oluşturduğum Mac uygulaması bir web tarayıcısı görünümü içeriyor.

Benim ViewController.swift diyor ki:

import Cocoa 
import WebKit 

class ViewController: NSViewController { 

    @IBOutlet var url: NSTextField! 
    @IBOutlet var browser: WKWebView! 

    @IBAction func go(sender: AnyObject) { 

     // browser.loadRequest(NSURLRequest(URL:NSURL(string: url.stringValue)!)) 
     // above line broken down for debugging 

     let url1 = url.stringValue 
     print("url1 = \(url1)") 

     let url2 = NSURL(string: url1)! 
     print("url2 = \(url2)") 

     let url3 = NSURLRequest(URL:url2) 
     print("url3 = \(url3)") 

     print("browser is \(browser)") 

     browser.loadRequest(url3) 

    } 
} 

uygulaması başarıyla oluşturur.

url1 = http://apple.com 
url2 = http://apple.com 
url3 = <NSURLRequest: 0x600000001400> { URL: http://apple.com } 
browser is <WebView: 0x608000120e60> 
2016-04-06 13:39:51.664 Testivate[6516:427535] -[WebView loadRequest:]: unrecognized selector sent to instance 0x608000120e60 
2016-04-06 13:39:51.664 Testivate[6516:427535] -[WebView loadRequest:]: unrecognized selector sent to instance 0x608000120e60 
2016-04-06 13:39:51.667 Testivate[6516:427535] (
    0 CoreFoundation      0x00007fff93f4a4f2 __exceptionPreprocess + 178 
    1 libobjc.A.dylib      0x00007fff8ca7a73c objc_exception_throw + 48 
    2 CoreFoundation      0x00007fff93fb41ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205 
    3 CoreFoundation      0x00007fff93eba571 ___forwarding___ + 1009 
    4 CoreFoundation      0x00007fff93eba0f8 _CF_forwarding_prep_0 + 120 
    5 Testivate       0x000000010000271a _TFC9Testivate14ViewController2gofPs9AnyObject_T_ + 2154 
    6 Testivate       0x00000001000027b6 _TToFC9Testivate14ViewController2gofPs9AnyObject_T_ + 54 
    7 libsystem_trace.dylib    0x00007fff96e1807a _os_activity_initiate + 75 
    8 AppKit        0x00007fff94567e89 -[NSApplication sendAction:to:from:] + 460 
    9 AppKit        0x00007fff94579fde -[NSControl sendAction:to:] + 86 
    10 AppKit        0x00007fff94579f08 __26-[NSCell _sendActionFrom:]_block_invoke + 131 
    11 libsystem_trace.dylib    0x00007fff96e1807a _os_activity_initiate + 75 
    12 AppKit        0x00007fff94579e65 -[NSCell _sendActionFrom:] + 144 
    13 libsystem_trace.dylib    0x00007fff96e1807a _os_activity_initiate + 75 
    14 AppKit        0x00007fff9457848a -[NSCell trackMouse:inRect:ofView:untilMouseUp:] + 2693 
    15 AppKit        0x00007fff945c0fd0 -[NSButtonCell trackMouse:inRect:ofView:untilMouseUp:] + 744 
    16 AppKit        0x00007fff94576bb4 -[NSControl mouseDown:] + 669 
    17 AppKit        0x00007fff94acb469 -[NSWindow _handleMouseDownEvent:isDelayedEvent:] + 6322 
    18 AppKit        0x00007fff94acc44d -[NSWindow _reallySendEvent:isDelayedEvent:] + 212 
    19 AppKit        0x00007fff9450b63d -[NSWindow sendEvent:] + 517 
    20 AppKit        0x00007fff9448bb3c -[NSApplication sendEvent:] + 2540 
    21 AppKit        0x00007fff942f2ef6 -[NSApplication run] + 796 
    22 AppKit        0x00007fff942bc46c NSApplicationMain + 1176 
    23 Testivate       0x0000000100004f34 main + 84 
    24 libdyld.dylib      0x00007fff9099a5ad start + 1 
    25 ???         0x0000000000000003 0x0 + 3 
) 

Başlangıçta hata loadRequestbrowser için tanınmayan bir seçici olduğunu söylüyordu, ama ben ettik görebilirsiniz: Bunu çalıştırdığınızda, URL alanına http://apple.com girip Git butonuna tıklayın, görüyorum işlevi ayırdı ve browser açıkça WebView, definitely has loadRequest as a method bir örneğidir. Beklenen NSURLRequest object ile kesinlikle loadRequest yöntemini sağladığım yöntemi nasıl ayırdığımı görebilirsiniz.

Şimdi bunun belki de bunun WebView'ı Main.storyboard numaralı telefondan bulamaması ile ilgili bir şeyleri olduğunu düşünüyorum, ama kesinlikle bunu yapabilmeli midir? Böyle Üzerinde bağlantıları tanımladığınız:

Screenshot of Connections Inspector

kaynak olarak Main.storyboard görüntülemek, diyor:

<webView fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Ocj-mD-woP"> 
    <rect key="frame" x="62" y="20" width="406" height="211"/> 
    <webPreferences key="preferences" defaultFontSize="12" defaultFixedFontSize="12"> 
     <nil key="identifier"/> 
    </webPreferences> 
</webView> 

herhangi bir düşünce? Teşekkürler.

+0

Eğer 'browser' Görüşmeyi bir' nil' aslında ise kontrol ederek hata ayıklama mı? – tktsubota

+0

Çok uzak değil TroyT. Bunun nasıl yapılacağı hakkında daha fazla bilgi edinmek harika olurdu. Eğer 'browser' yazdırırken –

+0

Aldırma, senin kodunda görebilirsiniz. – tktsubota

cevap

2

İki farklı türde web görüntülerini karıştırıyorsunuz.

Kodunuzda, browser'un WKWebView olduğunu söylüyorsunuz. Bu, OS X 10.10'da ilk kez sunulan yeni web görünümü türüdür. Objective-C'de -loadView: veya Swift'de loadView() isimli bir yönteme sahiptir. Eğer kodu çalıştırdığınızda o size storyboard koymak ne çünkü

@IBOutlet var browser: WKWebView! 

Ancak, nesne, aslında bir WebView olduğunu. Bu daha eski bir web görünümü. Bu, -loadView: adlı bir yönteme sahip olmadığından, aramayı denediğinizde hata alırsınız.

browser is <WebView: 0x608000120e60> 
-[WebView loadRequest:]: unrecognized selector sent to instance 0x608000120e60 

(Bağlı Belgeleri okuyun tekrar WebView 'ın ana çerçeve-loadRequest: uygular, ama WebView yapmaz..)

Burada iki olası düzeltme işlemlerini aşağıda

Kolay:WebView'u doğru kullanmak için kodunuzu düzeltin, ancak storyboard'u aynı bırakın.

@IBOutlet var browser: WebView! 
... 
browser.mainFrame.loadRequest(url3) 

Harder

: WKWebView kullanarak kodu saklayın, ama film şeridinden WebView çıkarın. Maalesef it's currently impossible to put a WKWebView in a storyboard

, kendiniz kurmak için bazı kod yazmak zorunda kalacak, böylece. Nasıl yapılacağına dair bir örnek için bağlantılı cevaba bakınız. Eğer WKWebView yeni özelliklerden yararlanmak istiyorsanız

, ikinci bir alternatif kullanmak gerekecek.

+0

thx! bu düzeltildi –

İlgili konular