目前,我们已经使用多个目标对 Swift 项目进行了模块化。目标编译为 .framework 文件,这些文件是更高目标的依赖项。我们有一个 Common 模块目标、一些 Product 模块目标和原始 App 目标。Common 将包含非常低级的代码、共享库以及可能由多个产品目标共享的任何特定代码。
所以应用程序会做:
import Common
import Product1
import Product2
Run Code Online (Sandbox Code Playgroud)
而 Product1 目标代码可能会这样做:
import Common
Run Code Online (Sandbox Code Playgroud)
通常流程是 Common -> Product* -> App,其中 Common 永远不会引用另一个方向。
不幸的是 Common 已经变大了,并且有很多代码可能不是每次导入都需要的。
我希望能够在 Swift 中实现的是这样的:
import Common.API
import Common.PurchaseCheckout
Run Code Online (Sandbox Code Playgroud)
我研究了模块映射,它允许设置导入子模块,但它都集中在 Objective-c 头文件上,而不是 Swift。有快速变化吗?
具体的需求是我们想创建一个轻量级的SDK,只使用部分功能,一旦我们“导入Common”,它就会使SDK膨胀,并且还增加了对很多不相关的cocoa-pods的依赖. 我们可以在 SDK 目标文件中逐个文件地包含文件,但希望模块化能让事情变得更简单。
编辑
看来我可以使用以下内容:
import class Common.FileDownloadAPI
import class Common.FileUploadAPI
Run Code Online (Sandbox Code Playgroud)
可能在我的代码中创建部分导入的印象。然而,modulemaps 似乎是objective-c 中的一种方式来为你做这件事,创建子模块。我不想编写 100 个类导入来导入子模块可能在一次导入中执行的 200 个文件中的一半。所以还在寻找思路。
我正在研究为iOS活动跟踪器使用延迟位置更新,它允许在后台使用位置服务.我已经实现了建议的代码片段(见下文).在Xcode调试中,延迟位置尝试启动几次,直到位置数据以每秒大约1次进入.之后,它声称成功启动延迟,并且在指定的时间段到期后,完成触发器的回调也会成功.但是在此期间,位置处理程序仍然每秒运行一次.我已经读到这是因为手机还没有准备好进入后台,而Xcode中的测试就是这样做的.注意,关闭屏幕后立即调用AppDelegate的"didEnterBackground"事件处理程序,并在重新打开应用程序时重新启动.
我运行相同的代码,手机断开连接作为另一个测试,靠近窗户的GPS,屏幕关闭,或切换到完全不同的应用程序,它仍然从来没有真正推迟更新.我可以告诉,因为网络更新仍然每30秒进入一次,而不是下面的代码示例中所需的120秒的间隔.
还有什么需要实际让延期工作,因为启动它们没有错误,他们确实得到他们的完成回调?为什么即使应用程序进入后台,位置更新仍以每秒1次的速度继续?
Iphone 5s,IOS 7.1.1
// .h file (partial)
@interface MotionTracker : NSObject<CLLocationManagerDelegate, UIAccelerometerDelegate>
@property (strong, nonatomic) CLLocationManager *locationManager;
@end
// .m file (parial)
- (id) init {
if(self = [super init]){
_locationManager = [[CLLocationManager alloc] init];
_locationManager.delegate = self;
_locationManager.distanceFilter = kCLDistanceFilterNone;
_locationManager.desiredAccuracy = kCLLocationAccuracyBest;
// if set to YES (default), app stops logging location at some point and doesn't resume in any timely fashion, all data points lost in between
_locationManager.pausesLocationUpdatesAutomatically = NO;
_locationManager.activityType = CLActivityTypeFitness;
} …Run Code Online (Sandbox Code Playgroud) 我刚刚启动了一个带有IOS静默推送通知的项目,允许应用程序在后台更新.到目前为止我不清楚的一个基本点是,如果用户完全拒绝推送消息,会发生什么?这会拒绝应用程序收到静默推送通知,还是仅导致设备不能以视觉/听觉方式向用户显示消息?
我意识到苹果有规则,如果允许推送应用程序不仅应该工作,但我很好奇如何最好地处理这种情况.
我正在为我的标准TextField使用"黑暗"式键盘.这是用于登录文本字段,或"忘记我的密码"文本字段,用户在其中输入一些信息,提交它,如果成功,则将它们发送到另一个视图,通常由标准导航控制器popViewControllerAanimated:.AlertView可能出现在两者之间.
我看到很多问题是键盘是打开的,正常的"深色"灰色,然后用户点击提交,可能会出现一个警报视图,当解雇时,视图转移到下一个屏幕以前的键盘关闭屏幕.在新屏幕上,另一个默认样式键盘可能会或可能不会向上滑动然后消失(甚至没有文本域聚焦!).然后,当点击另一个文本字段,或返回上一个视图并单击文本字段时,这个带有白键的黑色键盘会出现错误.它会继续出现在文本字段中,直到某些内容能够在几次单击后将其恢复为正常的深灰色.
我试图在popViewController发生之前以各种方式解除原始键盘,但它似乎没有帮助.如果AlertView出现在中间,我在单击AlertView按钮时将popViewController绑定到委托操作.键盘通常不会快速消失,在推动前离开.延迟对它没有帮助.
编辑:警报视图似乎是一个明确的罪魁祸首,以某种方式干扰弹出和键盘.
-(BOOL) textFieldShouldReturn:(UITextField *)textField{
[textfield resignFirstResponder];
[self.view endEditing:YES];
return YES;
}
-(IBAction)submitRequest {
[textfield resignFirstResponder];
[self.view endEditing:YES];
// make API call, if call succeeds run this block {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"..."
message:@"..."
delegate:delegate
cancelButtonTitle:@"OK"
otherButtonTitles:nil, nil];
dispatch_async(dispatch_get_main_queue(), ^{
[alert show];
});
// }
}
// delegate after alert OK is pressed
- (void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
[self.navigationController popViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)
如何避免使用黑/白键盘?
在我们的 Xcode 项目中,我们已经开始实现 ios 模块,将我们庞大的代码库划分为独立的部分。
我们有以下模块:
Common
Product1
Product2
Product
App
Run Code Online (Sandbox Code Playgroud)
其中App使用Product1、Product2和Common,并且Product1使用Common,但Common对更高级别的项目一无所知。
在 XCode/Swift 中,它们作为单独的目标实现,并生成导入到更高级别目标中的框架。它非常适合该应用程序。最终产品应用程序编译时无需关心它来自通过依赖框架的多个目标。
我们还有一个为第三方部署的实际框架。之前,我们选择了框架中存在的所有文件,并使它们成为框架目标和应用程序目标的双重成员。
然而现在我们有了这种依赖关系,其中较低级别的模块作为“目标依赖关系”包含在 xcode 中。
ProductFramework3rdParty
Product1
Common
Run Code Online (Sandbox Code Playgroud)
ProductFramework 在模拟器中编译良好,它可以嵌入到准系统示例应用程序中并作为嵌入式二进制文件运行。这就是目标。
然而,在设备上,它给出了在运行时找不到通用框架的错误。
dyld: Library not loaded: @rpath/Common.framework/Common
Referenced from:
/private/var/mobile/Containers/Bundle/**/**/ProductFramework3rdParty/ProductFramework3rdParty
Reason: image not found
Run Code Online (Sandbox Code Playgroud)
仅当我将 Common 模块以及最终的 Product1 模块也嵌入到 3rd 方应用程序中时,它才有效。这并不是真正的预期目标,必须向客户提供我们的官方框架以及内部模块。我们的代码中最终可能有 5-10 个模块,并且希望将其全部打包到单个分布式框架中。
我们应该怎么做?
我尝试将 Common 的 Mach-O 从动态更改为静态,但没有成功,它创建了一长串我无法克服的链接错误。以及将 Common 扩大到 100mb,比以前大得多。
我正在尝试设置一些反应路由器路由,专门使用最新的 v6。我想做的是拥有一个具有类似于休息的页面层次结构的网站,并且能够轻松解析出 ID。具体来说,路径上有两级 ID。
我在如何使用 React 路由器范例正确解析 url 中的 ID 时遇到了麻烦。我可以window.location.pathname自己使用和解析它,或者像 2003 年那样使用库,但必须有一种更具反应性的方法来做到这一点。
这是所需的基本 url 结构:
/collection/ (all collections)
/collection/123 (collection 123)
/collection/123/abc (collection 123, subgroup abc)
/collection/123/all (special handler, collection 123, all subgroups)
Run Code Online (Sandbox Code Playgroud)
似乎我可以使用useParams(),但是当我console.log在屏幕中使用时,它似乎根本没有帮助或结构化。见下文。
是否应该有更好的方法来提取路线中的:id或指定的内容?:groupId无论如何,我最终仍然需要解析自己,而不只是“*”的一个属性。我希望有一个“id”和“groupId”属性,但也许我的做法是错误的。
// App.tsx
<BrowserRouter>
<Routes>
<Route path="/collection/*" element={<CollectionScreen />} />
</Routes>
</BrowserRouter>
Run Code Online (Sandbox Code Playgroud)
// CollectionScreen.tsx
const params = useParams()
console.log(params);
// {*: ''} // path: /collection
// {*: '123'} // path: /collection/123
// {*: '123/abc'} // …Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,我使用基于JSON的API.作为JSON的一部分,通常将值设置为"null".这可能很常见:
{"data":["one","two","three"],"name":null,otherstuff:10}
Run Code Online (Sandbox Code Playgroud)
最近我试图在NSUserDefaults中存储一个从JSON对象转换的misc NSDictionary层次结构.不幸的是,如果存在空数据,则在IOS中将其转换为[NSNull null]会导致异常.显然,无法保存在prefs中.
我想知道是否有人曾经解决过这个问题?我尝试添加一些逻辑来首先从JSON中删除所有空值,但成功有限,但在存储之前必须修改数据似乎是不合适的.有没有更好的方法来处理这个?
我有一个表现奇怪的UITableView.具体来说,它在cellForRowAtIndexPath中生成了一个常数8个单元格,带有一些基本文本和图像.在模拟器中它很棒.在我的Iphone5上,它的工作方式与模拟器完全相同,但是在我的Iphone5s上,单元格在第一个单元格应该存在的地方互相混淆.下面的图像分别显示5s和模拟器/ 5.左侧"退出应用程序"按钮应存在于最后一个单元格中,并且正在添加到其他内容之上,也由箭头指示.
编辑:第三个图像是64位模拟器,更新的cellForRowAtIndexPath是超简化的,只需将textLabel设置为所有8行的"Hello".
Autolayout未在应用程序的任何位置使用.
Iphone 5S正在运行IOS7.1.1,但Iphone5正在运行IOS7.1.模拟器是最新Xcode(5.1.1)的一部分,最新的7.1.我无法想象5s的最新.1可能会导致这种情况.
有什么想法为什么这是混乱的,具体为什么只有在5S?

- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView {
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 8;
}
- (float)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath {
float height = self.view.frame.size.height / [self tableView:tableView numberOfRowsInSection:indexPath.section];
return height;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *CellIdentifier = @"CellMain";
UITableViewCell *_cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (_cell == nil) {
_cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
_cell.selectionStyle = UITableViewCellSelectionStyleNone;
}
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *user_fullname = [userDefaults valueForKey:@"user_fullname"];
_cell.textLabel.textColor = [UIColor …Run Code Online (Sandbox Code Playgroud) 我有一个团队正在研究一些IOS代码.一位开发人员(我)拥有Xcode6-beta和几行IOS8特定代码.当另一个Xcode5的开发人员为IOS7构建它时,编译失败,因为他不存在IOS8 SDK.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){
// ios8 code
} else {
// ios7 and less way
}
Run Code Online (Sandbox Code Playgroud)
有没有办法忽略基于SDK或Xcode版本的Xcode编译中的IOS8代码,以便编译?
我已经看到了一些非常基本的潜在watchkit应用程序演示,有些似乎实现了动画.例子可能是:
到目前为止,我看到的唯一一种做动画的方法是在一段时间内拍摄一系列图像:
[imageView startAnimatingWithImagesInRange:NSMakeRange(0, 60) duration:1.0 repeatCount:0];
Run Code Online (Sandbox Code Playgroud)
这些先前的动画示例通常如何实现?我无法想象他们都完成了图像序列.我认为甚至不能分层图像,协调放置将是一场噩梦.
ios ×8
module ×2
swift ×2
target ×2
alertview ×1
animation ×1
deferred ×1
frameworks ×1
iphone ×1
json ×1
keyboard ×1
location ×1
module-map ×1
null ×1
react-router ×1
reactjs ×1
uitableview ×1
watchkit ×1
xcode ×1