【问题标题】:Xamarin Main Nib FileXamarin 主笔尖文件
【发布时间】:2016-02-03 17:33:56
【问题描述】:

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

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

这是我的尝试大纲:

  1. 创建新的跨平台 - 单一视图应用,为其命名(例如 Sample)
  2. 删除 Main.storyboard 和 ViewController.cs
  3. 展开 Sample.iOS,右键单击并添加 New File > iOS > View Controller,为其命名(例如 MainNib)
  4. 打开 Info.plist,将 iPhone/iPod 和 iPad 部署的 Main Interface 更改为 MainNib
  5. 保存并运行 > 出现黑色
  6. 打开 Info.plist,转到源代码编辑器并删除主故事板属性,添加值为“MainNib”的“主 nib 文件名”和“主 nib 文件名 (iPad)”条目
  7. 保存并运行 > 在名为 view 的属性上抱怨键值合规性崩溃

【问题讨论】:

标签: ios xamarin nib


【解决方案1】:

因此,如果您查看您的状态跟踪,您将看到 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>

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

【讨论】:

  • 非常令人困惑的结果: 1. 如您所演示的那样注释掉连接确实允许应用程序运行,但屏幕显示为黑色。 2.当我尝试向视图添加一个按钮(并为其命名)时,Xamarin 正确地生成了 MainNib.designer.cs 文件的出口,但无法运行并抱怨按钮的类似键值抱怨问题甚至虽然它应该由designer.cs文件管理
  • 我在 XCode 中一直看到这一点,当创建一个新的 nib 文件时,总是有一个需要连接的视图插座(或者它会抛出我在 Xamarin 中看到的相同异常),我令 Xamarin 没有为 view 属性生成 Outlet 感到惊讶。我也尝试过(没有效果)在 MainNib.cs 中手动为其添加一个插座。我对 C# 还不是很熟练,但假设由于它是与 Designer.cs 共享的部分类,因此框架也会在 MainNib.cs 中声明的插座上使用。
【解决方案2】:

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

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

希望能解决崩溃问题。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多