Xamarin 主笔尖文件

Xamarin Main Nib File

我正在研究将我们维护的旧应用程序移植到 Xamarin 以在我们的 iOS 和 Android 版本之间获得共享代码库的可能性。

不幸的是,我 运行 在移植 iOS 应用程序时遇到了一些问题。我尝试了不同的方法来解决这个问题,让应用程序以 nib 文件作为主要入口点启动(因为这是我们当前应用程序所做的,它是旧的)。无论我做什么,它似乎总是崩溃或变黑。

以下是我的尝试概要:

  1. 创建新的跨平台 - 单视图应用程序,为其命名(例如示例)
  2. 删除 Main.storyboard 和 ViewController.cs
  3. 展开 Sample.iOS,右键单击并添加新文件 > iOS > 视图控制器,为其命名(例如 MainNib)
  4. 打开 Info.plist,将 iPhone/iPod 和 iPad 部署的主界面更改为 MainNib
  5. 保存并 运行 > 变黑
  6. 打开Info.plist,转到源代码编辑器并删除主情节提要属性,添加“Main nib file name”和“Main nib file name (iPad)”值为“MainNib”的条目
  7. 保存并 运行 > 崩溃抱怨 属性 命名视图
  8. 上的键值合规性

因此,如果您查看状态跟踪,您会看到在尝试建立出口连接时抛出 ObjC 异常:

0   CoreFoundation                      0x008dea14 __exceptionPreprocess + 180
1   libobjc.A.dylib                     0x0890ce02 objc_exception_throw + 50
2   CoreFoundation                      0x008de631 -[NSException raise] + 17
3   Foundation                          0x00f371bc -[NSObject(NSKeyValueCoding) setValue:forUndefinedKey:] + 282
4   Foundation                          0x00e9183a _NSSetUsingKeyValueSetter + 115
5   Foundation                          0x00e917bf -[NSObject(NSKeyValueCoding) setValue:forKey:] + 295
6   Foundation                          0x00ec601d -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 384
7   UIKit                               0x03639cb4 -[UIRuntimeOutletConnection connect] + 132

查看您的 .xib,定义了一个连接,但您在 C# 中没有匹配的定义(以及生成的 .h),因此将其注释掉将允许 .xib 要在运行时更正解析:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="9532" systemVersion="15D21" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES">
    <dependencies>
        <deployment identifier="iOS"/>
        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="9530"/>
    </dependencies>
    <objects>
        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner" customClass="MainNib">
<!-- 
            <connections>
                <outlet property="view" destination="2" id="RRd-Eg-VrN"/>
            </connections>
 -->
        </placeholder>
        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
        <view contentMode="scaleToFill" id="2">
            <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
            <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
        </view>
    </objects>
</document>

除了具有两个属性设置的 UIView 之外,.xib 中没有任何内容。

我相信您的 MainNib 有代码中使用的组件,但缺少与属性的连接。

可能的解决方案:
* 右击 MainNib 文件 -> Open With -> Xcode Interface Builder
Xcode 将打开那个 .xib 文件。
* Select File's OwnerDocument Outline 中的 Placeholders 下(在 ProjectNavigatorStoryboard Canvas 之间)。
* 单击Xcode右侧的Connections Inspector
* 检查您将从代码中操作的所有视图组件是否与其相应的属性相关联。
* 修复连接,或根据需要创建属性。
* 保存更改并关闭 xcode.
* 刷新您的 Xamarin 项目或重新打开项目并 运行.

希望能解决崩溃问题。

我仔细研究了 github 上的一些代码示例并找到了合适的解决方案。无论 Xamarin 在幕后做什么来启动主 Window 似乎都与在 Info.plist 文件中设置主笔尖不兼容。例如,AQTapDemo project 通过在 AppDelegate 中手动加载视图控制器来解决此问题,而不是依赖从 Info.plist 属性自动加载。