![](/img/trans.png)
[英]Unknown class CustomUITableViewCell in Interface Builder file xcode 8
[英]Admob Framework class not detected by Xcode interface builder
I've been trying to implement native Google adMob ads in my iOS app and followed the admob official tutorial: https://developers.google.com/admob/ios/native/advanced
Whether I added the required admob framework manually or by CocoaPods, all the classes in the admob frameworks were not detected by the interface builder, so I could not set the Custom class of UIView to the wanted admob view classes. 但奇怪的是,在我的 swift 文件中導入框架后,我可以使用所有與 admob 相關的類。 請看下面的截圖:
我發現了一個 github 項目,它只是通過 Cocoapoding admob 框架實現了 admob 原生廣告。(項目鏈接) 我下載了它的源代碼,奇怪的是admob框架類在這個項目中可以通過接口面檢測到。
幾天來我一直在摸不着頭腦,尋找解決方案沒有運氣。 如果您知道為什么會發生這種情況並且您的幫助受到高度贊賞,請幫助我。
TL;DR:對於那些無法將 SDK 降級到 7.68.0 以下的人,打開xib
作為源代碼並手動編輯代碼以設置自定義 Class 並將插座鏈接到視圖。
您可以通過在字段中直接鍵入 class 名稱來將自定義 class 設置為GADUnifiedNativeAdView
(或GADNativeAdView
,因為GADUnifiedNativeAdView
現在已棄用)。
請注意,如果 class 名稱未顯示在下拉列表中,您無需擔心。 從下面的屏幕截圖中可以看到,您只需鍵入它即可。 (例如GADUnifiedNativeAdView
)
但是,您無法將 outlet 鏈接到視圖(例如,將您的視圖鏈接到每個原生廣告視圖),因為您不會在GADUnifiedNativeAdView
中看到 outlet,正如您從以下屏幕截圖中看到的那樣。
在這種情況下,您可以通過編輯視圖的源代碼來鏈接插座。
*.xib
) 文件和 select Open As > Source Code 。GADUnifiedNativeAdView
/ GADNativeAdView
的<view>
標記中,添加<connections>
標記並聲明每個原生廣告視圖的出口。 請注意,您需要從destination
標簽中引用視圖的 object ID,並自己為每個插座生成 object ID。以下示例展示了四種原生廣告資源(媒體、圖標、標題和正文):
<?xml version="1.0" encoding="UTF-8"?>
<document ...>
<objects>
<view contentMode="scaleToFill" id="iN0-l3-epB" customClass="GADUnifiedNativeAdView">
<subviews>
<view ... id="BAF-yb-wZL" userLabel="media" customClass="GADMediaView">
...
</view>
<view ... id="U4D-Gx-1Wm" userLabel="bottom">
<subviews>
<imageView ... id="6hd-Ad-50f" userLabel="icon">
...
</imageView>
<stackView ...>
<subviews>
<label ... id="UdA-3o-ttn" userLabel="headline">
...
</label>
<label ... id="Dqe-NX-Uu2" userLabel="body">
...
</label>
</subviews>
</stackView>
</subviews>
</view>
</subviews>
<!-- TODO: Add outlet connections -->
<connections>
<outlet property="bodyView" destination="Dqe-NX-Uu2" id="GAD-Nat-Bdy"/>
<outlet property="headlineView" destination="UdA-3o-ttn" id="GAD-Nat-Hdl"/>
<outlet property="iconView" destination="6hd-Ad-50f" id="GAD-Nat-Ico"/>
<outlet property="mediaView" destination="BAF-yb-wZL" id="GAD-Nat-Mdv"/>
</connections>
</view>
</objects>
</document>
重要提示:您需要為與其他類似的插座(例如, XXX-YYY-ZZZ
)生成 object ID,以避免意外錯誤。 我在上面的例子中使用了GAD-Nat-XXX
格式。
如果要查找每個插座的屬性名稱,請單擊自定義 class 下拉列表中的灰色箭頭按鈕。
然后,您將從其 header 文件中找到插座的屬性名稱。 (例如GADUnifiedNativeAdView
)
重要提示:您需要至少構建一次項目以使您的 Xcode 為您的自定義 class 找到 header。
在Project Navigator中,通過右鍵單擊視圖並選擇Open As > Interface Builder XIB Document來使用界面構建器打開視圖文件。
在連接檢查器中,確認您在上一步中添加的連接。 您會看到一個警告圖標,但您可以忽略它。
嘗試編輯 Storyboard 的 XML 以解決此問題。
GADUnifiedNativeAdvView
"保存 storyboard 或查看。
再次右鍵單擊 Project Navigator 面板中的情節提要/視圖條目,然后 select Open As->Interface Builder
Hpefully,您將看到自定義 class 名稱。
將 CocoaPods pod 版本降級到7.67.0
。 (-:
播客文件
pod 'Google-Mobile-Ads-SDK', '7.67.0'
這是因為GoogleMobileAds.framework
在GoogleMobileAds.xcframework
中變成了7.68.0+
- source 。 這意味着 Objective C 運行時在框架(iOS 9)和主要目標(iOS 14.0+)之間是不同的。 XCFramework
是一種特殊類型的二進制框架,因此在 iOS 版本已經編譯后手動編輯它不會有任何區別,事實上,即使您在Podfile
中指定 iOS 版本也不會有任何區別.
主代碼在底層有一個不同的、更快的 Objective-C 運行時,因此使用不同的數據結構跟蹤類到XCFramework
。 例如,如果在框架中定義了一個類別,即使沒有使用新的覆蓋方法(在運行時),它也將存儲在讀寫 memory 中。 另一方面,iOS 14.0+ 中的 Objective-C 運行時在用於節省 RAM 之前不會加載這些方法。 這是舊 iOS 版本的重大更改,因為用於索引這些類的舊數據結構不再包括類別方法(在同一存儲區域中),並且框架中的依賴邏輯(讀取這些數據結構)將不再起作用。 方法調配的處理方式不同,這也是GoogleUtilities
所做的( GoogleMobileAds
的依賴項),因此這可能會導致問題。 因此,即使 IB 自動完成功能不起作用(那里沒有大問題),在運行時也不會動態找到 class。 我沒有提到在新運行時對method list
表示更改的更改,因為該問題超出了 scope 的范圍,但舊方法列表在運行時仍然可用(非破壞性更改)。
要解決這個問題,現在只需在Podfile
中使用7.67.0
版本。 作為框架的最終用戶,您不能對此做任何其他事情,因為podspec
將框架類型指定為vendored_framework
並且只能在框架的源代碼中進行編輯。 我試圖禁用use_frameworks
但這沒有編譯。 如果您可以為自己的框架編輯podspec
,則更改為 static 框架是一個可行的解決方案(帶有警告)。 該框架在構建時鏈接,而不是在 static 框架的加載時鏈接,因此您應該能夠在 IB 中看到框架 class,但隨后您必須使框架的依賴 pod 也為 ZA81259CEF8E959C624ZD1D456(更多工作)。 更簡單的等價物是降級 pod,或在 Podfile 中禁用use_frameworks
。 但是,框架具有更快的性能(鏈接時間)並且通常是首選的,這就是為什么它們默認為 CocoaPods 啟用的原因。
我還建議為此錯誤創建一個新的 GitHub 問題,但看起來 SDK 不是開源的。 也許這個錯誤將來會由 Apple 解決,或者一旦他們意識到它就會由 Google 解決,但目前這是一種解決方法。
1:吊艙安裝——干凈安裝
2:打開Xcode並shift - command - k
3:關閉 Xcode 並重新打開
4:喝咖啡,等待 xcode 預構建完成
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.