gpt4 book ai didi

xamarin.ios - Xamarin iOS 应用程序在使用 AssociatedObject 为 UIAlertController 设置 AutomationId 时崩溃 - objc_getAssociatedObject

转载 作者:行者123 更新时间:2023-12-04 00:00:22 25 4
gpt4 key购买 nike

我们正在尝试使用 Xamarin.iOS 中的扩展为 UIAlertController 设置 AutomationId。但该应用程序在 var valuePtr = objc_getAssociatedObject(alertAction.Handle, DescriptiveName.Handle); 处不一致崩溃在 GetAccessibilityIdentifier 方法下。也不知道为什么会崩溃。

下面是代码示例:

public static class UIAlertControllerExtension
{
public static void ApplyAccessibilityIdentifiers(this UIAlertController alertController)
{
foreach (var action in alertController.Actions)
{
var lable = action.ValueForKey((NSString)"__representer");
var view = lable as UIView;
view.AccessibilityIdentifier = action.GetAccessibilityIdentifier();
}
}
}

public static class UIAlertActionExtension
{

private static readonly NSString DescriptiveName = new NSString("AccesabilityIdentifier" + nameof(UIAlertActionExtension));

#region "Extension properties"

enum AssociationPolicy
{
Assign = 0,
RetainNonAtomic = 1,
CopyNonAtomic = 3,
Retain = 01401,
Copy = 01403,
}

[DllImport("/usr/lib/libobjc.dylib")]
static extern void objc_setAssociatedObject(
IntPtr pointer, IntPtr key,
IntPtr value, AssociationPolicy policy);

[DllImport("/usr/lib/libobjc.dylib")]
static extern IntPtr objc_getAssociatedObject(
IntPtr pointer, IntPtr key);


#endregion

public static void SetAccessibilityIdentifier(this UIAlertAction alertAction, NSString accessabilityIdentifier)
{
objc_setAssociatedObject (alertAction.Handle, DescriptiveName.Handle, accessabilityIdentifier.Handle, AssociationPolicy.Retain);
}

public static NSString GetAccessibilityIdentifier(this UIAlertAction alertAction)
{
try
{
var valuePtr = objc_getAssociatedObject(alertAction.Handle, DescriptiveName.Handle); // App is crashed at this line.
if (valuePtr != IntPtr.Zero)
{
var result = ObjCRuntime.Runtime.GetNSObject(valuePtr);
if (result != null)
return (NSString)result;
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

//var value = ObjCRuntime.Runtime.GetNSObject(valuePtr) as NSString;
return new NSString("");
}

}

使用上述扩展方法创建警报 Controller 并设置 AutomationId,如下所示。
private void ShowAlert()
{
var alertController = UIAlertController.Create("Title", "Message", UIAlertControllerStyle.Alert);

var action = UIAlertAction.Create("Ok", UIAlertActionStyle.Default, delegate
{

// Do Somthing

});

action.SetAccessibilityIdentifier((NSString) accessibilityIdentifier);

alertController.AddAction(action);

this.PresentViewController(alertController, true, () => { alertController.ApplyAccessibilityIdentifiers(); });
}

我们从 View Controller 的按钮单击中调用此方法,并且它运行良好几次。但是当第 3 次或第 4 次显示警报时,应用程序崩溃了。

请帮我解决这个问题。

提前致谢。

最佳答案

AssociationPolicy.Retain可能会在意外的时间释放此属性,因此您的应用程序崩溃。您可以将其更改为 AssociationPolicy.RetainNonAtomic . NonAtomic 将使您的应用程序运行平稳、速度更快。

如果您只想存储一个字符串并稍后使用它。为什么不试试 NSUserDefaults还是静态实例?

关于xamarin.ios - Xamarin iOS 应用程序在使用 AssociatedObject 为 UIAlertController 设置 AutomationId 时崩溃 - objc_getAssociatedObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50506011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com