我正在尝试为GPUImage项目创建绑定,但没有一个绑定类正在工作.例如,GPUImageView:
在ObjC中它被声明为这样(git中的头文件):
@interface GPUImageView : UIView <GPUImageInput>
//then some fields, properties and methods I'm not interested in
Run Code Online (Sandbox Code Playgroud)
所以,我的ApiDefinition.cs看起来像这样:
namespace GPUImage
{
[BaseType (typeof(NSObject))]
[Model]
interface GPUImageInput {
}
[BaseType (typeof(UIView))]
interface GPUImageView : GPUImageInput {
[Export ("initWithFrame:")]
IntPtr Constructor(RectangleF frame);
}
}
Run Code Online (Sandbox Code Playgroud)
LinkWithAttributes:
[assembly: LinkWith ("libGPUImage.a", LinkTarget.Simulator | LinkTarget.ArmV7 | LinkTarget.ArmV7s, ForceLoad = true, Frameworks = "CoreMedia CoreVideo OpenGLES QuartzCore AVFoundation UIKit Foundation")]
Run Code Online (Sandbox Code Playgroud)
它构建好并创建DLL.但是当我尝试在我的项目中使用它时:
var iv = new GPUImageView (new RectangleF (0, 0, 100, 100));
Run Code Online (Sandbox Code Playgroud)
抛出异常: …
令人沮丧的事实:在召唤之后tableView:moveRowAtIndexPath:toIndexPath:,tableView:cellForRowAtIndexPath:不会被召唤出那一行.
在更新块reloadRowsAtIndexPaths:withRowAnimation:之后或之前调用也不起作用:它会引发不一致错误.tableView:moveRowAtIndexPath:toIndexPath:UITableView
我看到2个解决方法:删除+插入而不是移动或在另一个更新块中重新加载.
我的问题是:是否有其他方法可以重新加载并在同一个更新块中移动UITableView的行?
好吧,每个人都知道在ObjC我们有
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
Run Code Online (Sandbox Code Playgroud)
请注意,completion块具有BOOL参数.现在让我们来看看Monotouch:
public static void Animate (double duration, double delay, UIViewAnimationOptions options, NSAction animation, NSAction completion)
Run Code Online (Sandbox Code Playgroud)
NSAction是:
public delegate void NSAction ();
Run Code Online (Sandbox Code Playgroud)
只是没有任何争论的代表.此外,在Monotouch"内部"我们可以看到:
public static void Animate (double duration, double delay, UIViewAnimationOptions options,
NSAction animation, NSAction completion)
{
UIView.AnimateNotify (duration, delay, options, animation, delegate (bool x)
{
if (completion != null)
{
completion ();
}
});
}
Run Code Online (Sandbox Code Playgroud)
注意delegate (bool x),它就像我需要的那样调用函数.现在,我如何通过Action<bool>完成UIView.Animate?
我正在重复使用标题,将它们保存在字典中,其中节号是键,标题视图是值.
在我动画删除一个部分并重新加载另一个部分后,只有这些部分的标题视图"消失".经过一番搜索,我发现这些标题视图的帧已经改变了.Frame.X的从节头认为用删除UITableViewRowAnimationRight由屏幕宽度(320),并且这是realoaded与一个换档向右UITableViewRowAnimationAutomatic偏移了Y.
主要问题和困惑来自于我无法更改这些帧!好吧,他们一开始就改变了,但没有任何东西在视觉上改变,而另一个viewForHeaderInSection:帧的调用再次转移.
我是这样做的:
假设我们有3个部分,每个数据位于一个数组中_first,_second并且_third.我们打电话给按钮的touchupinside handleTouchUp:.(_second保持不变)
- (void) handleTouchUp: (UIButton *)sender
{
if ([_first count] == 0) {
sectionCount = 3;
_first = [NSMutableArray arrayWithObjects: @"First 1", @"First 2", nil];
_third = [NSMutableArray arrayWithObjects: @"Third 1", @"Third 2", @"Third 3", @"Third 4", @"Third 5", nil];
[tableView reloadData];
} else {
sectionCount = 2;
[_first removeAllObjects];
_third = [NSMutableArray arrayWithObjects: @"First 1", …Run Code Online (Sandbox Code Playgroud) 我已将Crashlytics集成到我的Xamarin.iOS项目中,Crashlytics启动,应用程序出现在crashlytics网站上.但是,当crashlytics捕获异常时,它会因下一个错误而崩溃:
信号%d,info%p,uapVoid%p
无法设置堆栈%s
我正在启动crashlytics并且AppDomain.CurrentDomain.UnhandledException像这样(方法描述):
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
IntPtr sigbus = Marshal.AllocHGlobal (512);
IntPtr sigsegv = Marshal.AllocHGlobal (512);
// Store Mono SIGSEGV and SIGBUS handlers
sigaction (Signal.SIGBUS, IntPtr.Zero, sigbus);
sigaction (Signal.SIGSEGV, IntPtr.Zero, sigsegv);
...
Crashlytics.Crashlytics.StartWithAPIKey("myApiKeyHere");
AppDomain.CurrentDomain.UnhandledException += (object sender, UnhandledExceptionEventArgs e) => {
...
};
sigaction (Signal.SIGBUS, sigbus, IntPtr.Zero);
sigaction (Signal.SIGSEGV, sigsegv, IntPtr.Zero);
Marshal.FreeHGlobal (sigbus);
Marshal.FreeHGlobal (sigsegv);
return true;
}
Run Code Online (Sandbox Code Playgroud) 有没有办法得到结果:
NSObject *a = [[NSObject alloc] init];
[a class];
Run Code Online (Sandbox Code Playgroud)
没有实例化?我希望将Class对象作为参数传递,然后检查它.像这样:
- (void) pushControllerOfClass: (Class) aClass
{
if([aClass isSubclassOfClass: *what should I write here?*]) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
直觉上,我试着写
if([aClass isSubclassOfClass: UIViewController]) {
Run Code Online (Sandbox Code Playgroud)
但它不起作用.感谢未来的回应.
更新: 在ObjectiveC中这样的功能是否被认为是错误的?我从Nahavandipoor的书" iOS 5 Programming Cookbook"中重构了代码.就像那样:
- (void) pushSecondController{
SecondViewController *secondController = [[SecondViewController alloc]
initWithNibName:nil
bundle:NULL];
[self.navigationController pushViewController:secondController animated:YES];
}
Run Code Online (Sandbox Code Playgroud)
至于我,这是一种不好的功能:它应该在没有参数的情况下进行参数化.
ios ×6
objective-c ×2
uitableview ×2
xamarin.ios ×2
binding ×1
c# ×1
crash ×1
crashlytics ×1
foundation ×1
gpuimage ×1
nsobject ×1
oop ×1
uikit ×1
uiview ×1
xamarin ×1