(转载请注明出处:https:///post/7078934919874871327
)
介绍
一个玩具,运用Objective-C完成相似SwiftUI的界面开发结构。
运用阐明
语法和命名根本遵从SwiftUI,能够完全运用结构的接口创立简单运用。
1、创立运用进口点
去掉原有oc工程中的main
函数,并在自己的App代理对象中完成OCAppProtocol
协议即可(有且只有一个)。例如:
@interface DemoApp : NSObject <OCAppProtocol>
@end
@implementation DemoApp
- (OCScene *)body {
return
OCWindowGroup(^{
DemoView();
}).onChange(^(OCScenePhase scenePhase, OCScenePhase newScenePhase) {
switch(newScenePhase) {
case OCScenePhaseBackground:
break;
case OCScenePhaseActive:
break;
case OCScenePhaseInactive:
break;
}
});
}
@end
也能够创立单独的界面,通过OCHostingController
办法与原有的oc工程桥接:
OCHostingController(view, ^(UIViewController *vc) {
// ...
});
2、视图元素的运用
与SwiftUI根本保持一致。继承OCView
类并完成body
办法,例如:
- (OCView *)body {
return
TabView(^{
NavigationView(^{
ScrollView(^{
Image(@"logo")
.resizable(UIEdgeInsetsZero, UIImageResizingModeTile)
.aspectRatio(UIViewContentModeScaleAspectFit)
.frame(200, 50, OCAlignmentCenter);
HStack(^{
Text(@"文本");
Button(@"按钮", nil);
TextField(@"输入框", $(self->_text), nil, nil);
TextEditor($(self->_text));
});
WebView([NSURL URLWithString:@"https://www.baidu.com/"])
.frame(300, 210, OCAlignmentCenter);
for (int i = 0; i < 50; i++) {
HStack(^{
Text(@(i).stringValue);
Spacer();
});
}
}).tabItem(^{
Image(@"circle.fill");
Text(@"布局演示");
}).navigationBarTitle1(@"布局演示");
});
});
}
(转载请注明出处:https:///post/7078934919874871327
)
3、数据绑定
现在仅完成了State
和Binding
。与SwiftUI的写法稍有不同,State润饰是在类成员初始化时通过State()
办法完成,变量的更新需要通过StateUpdate()
办法。而Binding的润饰是运用$()
,例如:
- (OCView *)body {
return
TabView($(_selection), ^{
NavigationView(^{
VStack(^{
TextField(@"在此输入文本", $(self->_text), nil, ^{
[UIApplication.sharedApplication.keyWindow endEditing:YES];
}).background(OCColor.lightGrayColor);
HStack(^{
Text([NSString stringWithFormat:@"文本长度:%ld", self->_text.length]);
Button(@"清除", ^{
StateUpdate(self->_text, nil);
});
});
NavigationLink(SubViewMake($(self->_isActive2)), $(self->_isActive2), ^{
Text(@"二级页面");
});
}).tabItem(^{
Image(@"pentagon.fill");
Text(@"数据绑定");
});
}).navigationBarTitle1(@"数据绑定");
});
}
阐明
这个结构仅仅一个玩具,性能自然不及SwiftUI,不主张用在实际出产环境中。别的考虑到开源项目不免会被人使用并商业化,因此暂不考虑开源。
(转载请注明出处:https:///post/7078934919874871327
)