我有以下代码为UIBarButton我的项目添加一些s.这适用于以下情况:
全部在iOS 7.1上
我没有iPhone 5设备可以测试.
它不适用于新的iPhone 5s.有什么不同?
这是代码:
-(void)setupNavigationBar
{
self.saveSearchButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.saveSearchButton setImage:[UIImage imageNamed:@"Save Search"] forState:UIControlStateNormal];
[self.saveSearchButton setImage:[UIImage imageNamed:@"Save Search Active"] forState:UIControlStateHighlighted|UIControlStateSelected];
[self.saveSearchButton addTarget:self action:@selector(saveSearchButtonpressed)forControlEvents:UIControlEventTouchUpInside];
[self.saveSearchButton setFrame:CGRectMake(0, 0, 23, 31)];
self.changeLayutButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.changeLayutButton setImage:[UIImage imageNamed:@"View List"] forState:UIControlStateNormal];
[self.changeLayutButton setImage:[UIImage imageNamed:@"View Grid"] forState:UIControlStateHighlighted|UIControlStateSelected];
[self.changeLayutButton addTarget:self action:@selector(changeViewLayoutButtonPressed)forControlEvents:UIControlEventTouchUpInside];
[self.changeLayutButton setFrame:CGRectMake(0, 0, 23, 31)];
self.sortByButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.sortByButton setImage:[UIImage imageNamed:@"Sort By"] forState:UIControlStateNormal];
[self.sortByButton …Run Code Online (Sandbox Code Playgroud) 我试图从UIWindow中的UIViewController访问我的UiTabBarController,
由于它不属于UITabBarController - 使用self.tabBarController..将无法正常工作,因为它将是零.
所以我尝试了这段代码:
BBAppDelegate *appDelegate = (BBAppDelegate *)[[UIApplication sharedApplication] delegate];
UITabBarController *tabBarController = appDelegate.window.rootViewController.tabBarController;
Run Code Online (Sandbox Code Playgroud)
当它使用调试器逐步执行代码时 - 我可以看到appDelegate有一个tabBarController并且它不是nil.但是在下一行
UITabBarController *tabBarController = appDelegate.window.rootViewController.tabBarController;
Run Code Online (Sandbox Code Playgroud)
这导致tabBarController的实例是零和tabBarController在appDelegate仍然有一个内存地址分配给它,它不是零.
我在这做错了什么?
编辑
这是我的调试器的样子:
谢谢!
编辑2
这是我设置添加到rootViewController的侧边菜单的人
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main_iPhone"
bundle: nil];
BBFilterViewController *loginController=[[UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"FilterViewController"]; UINavigationController *navController=[[UINavigationController alloc]initWithRootViewController:loginController];
self.tabBarController = [mainStoryboard instantiateViewControllerWithIdentifier: @"HomeScreen"];
MVYSideMenuOptions *options = [[MVYSideMenuOptions alloc] init];
options.contentViewScale = 1.0;
options.contentViewOpacity = 0.5;
options.shadowOpacity = 0.0;
MVYSideMenuController *sideBarController = [[MVYSideMenuController alloc]initWithMenuViewController:navController …Run Code Online (Sandbox Code Playgroud) 我已将Firebase SDK手动添加到我的项目中.(由于配置问题,无法使用cocoapod.)
我使用以下框架
FirebaseCore.framework
FirebaseInstanceID.framework
Firebasemessageing.framework
Run Code Online (Sandbox Code Playgroud)
在AppDelegate我已导入以下内容:
#import "Firebase.h
#import <FirebaseInstanceID/FirebaseInstanceID.h>
#import <FirebaseMessaging/FirebaseMessaging.h>
Run Code Online (Sandbox Code Playgroud)
如果我参考
[FIRMessaging messaging].remoteMessageDelegate = self;
Run Code Online (Sandbox Code Playgroud)
我遇到以下错误导致运行时崩溃:
控制台中的错误消息:
***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSCFConstantString fira_UTF32Length]:
但是,如果我注释掉并引用这行代码
[[FIRInstanceID instanceID] token]
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [FIRInstanceIDConfig setAllowGCMRegistrationWithoutAPNSToken:]:发送到实例的无法识别的选择器
我已经添加了我能想到的所有必需的框架,但仍然遇到了这个问题.
编辑
链接到项目的框架的完整列表:
堆栈跟踪:
这是它崩溃的线程:
0 ??? 0x00000001057f0a44 0x0 + 4387179076,
1 MyApp 0x000000010050f220 main + 0,
2 libsystem_c.dylib 0x0000000181363400 abort + 140, …Run Code Online (Sandbox Code Playgroud) 我有一个自定义单元格加载在我的集合视图的底部。它唯一的工作是显示活动指示器视图 - 这在应用程序进行新的工作调用时发生。
所以我将它添加到单元格中,如下所示:
BBLoaderCell *loaderCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"LoaderCell" forIndexPath:indexPath];
UIActivityIndicatorView * activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
activityIndicator.hidesWhenStopped = YES;
activityIndicator.hidden = NO;
activityIndicator.center = loaderCell.imageView.center;
activityIndicator.tag = 10;
[loaderCell.imageView addSubview:activityIndicator];
[activityIndicator startAnimating];
return loaderCell;
Run Code Online (Sandbox Code Playgroud)
这在我视图的最后一个单元格中显示了一个活动指示器 - 但它不旋转。有任何想法吗?
找到解决方案
根据评论 - 这是一个线程问题。我还采纳了将代码移动到单元格的自定义 nib 文件中的建议。
这是重构的代码:
BBLoaderCell *loaderCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"LoaderCell" forIndexPath:indexPath];
loaderCell.backgroundColor = [UIColor clearColor];
if (self.loadingMore == NO){
dispatch_async(dispatch_get_main_queue(), ^{
activityIndicator.hidden = YES;
[loaderCell.spinner stopAnimating];
});
}
else if (self.loadingMore == YES){
dispatch_async(dispatch_get_main_queue(), ^{
activityIndicator.hidden = NO;
[loaderCell.spinner startAnimating]; …Run Code Online (Sandbox Code Playgroud) 我在 UIViewController 中有一个 UICollectionView 。我还有两种不同的布局,当按下按钮时我会更改为它们。
我在两个 nib 文件中创建的两个单元格之间的布局发生变化。由于这两个单元格做了相同的更改,并且它们的布局只是不同 - 我为它们使用了相同的类,它是 UICollectionViewCell 的子类。
因此,当我的视图加载时,我注册我的两个单元格,如下所示:
[self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemTableViewCell" bundle:nil] forCellWithReuseIdentifier:@"TableItemCell"];
[self.tradeFeedCollectionView registerNib:[UINib nibWithNibName:@"BBItemGridViewCell" bundle:nil] forCellWithReuseIdentifier:@"GridItemCell"];
Run Code Online (Sandbox Code Playgroud)
这两个布局都是 UICollectionViewFlowLayout 的子类。在布局子类中,我只使用一种方法来设置布局/单元格的大小和间距 - 如下所示:
-(id)init
{
self = [super init];
if (self){
self.itemSize = CGSizeMake(320, 80);
self.minimumLineSpacing = 0.1f;
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
这是因为在更改视图时单元格始终具有正确的大小。
要更改视图,我有一个 UIButton,其中包含以下代码:
[self.tradeFeedCollectionView.collectionViewLayout invalidateLayout];
if (!self.gridLayoutActive){
self.gridLayoutActive = YES;
[self.tradeFeedCollectionView setCollectionViewLayout:self.grideLayout animated:YES];
self.lastLayoutUsed = @"GridLayout";
}
else {
self.gridLayoutActive = NO;
[self.tradeFeedCollectionView setCollectionViewLayout:self.tableViewLayout animated:YES];
self.lastLayoutUsed = @"TableLayOut";
}
Run Code Online (Sandbox Code Playgroud)
通过上面的代码,我得到了一个很好的动画,并且两个单元格之间的视图发生变化。
问题
更改视图时,UICollectionView 的可见区域会留下旧单元格,并且尚未更新为新单元格。这些牢房实际上已经改变了形状,但旧牢房的景色却被留下了。当我开始滚动时 …
iphone objective-c ios uicollectionviewcell uicollectionviewlayout
我正在构建一个GET向URL 发出请求的iOS应用程序.对于它所做的所有请求,我从基本URL构建URL,然后使用NSDictionaryKey-Value_pairs 添加参数.
我也用它AFNetworking 2.0来发出请求 - 它也提供了URL,并提供了NSDictionary键.
我现在遇到了一个问题,我需要使用的Web服务,需要多个键是相同的,具有不同的值.无法使用此功能NSDictionary
这意味着我无法成功运行Web服务.
以下是我需要最终URL的示例 -
http://demo.domain.net/services/ .... &IncludedUserIds = 12345&IncludedUserIds = 2345
以上URL的斜体位是我尝试使用AFNetworking和NSDictionary构建的.我怀疑我将不得不使用比NSDictionary更高级的东西来解决这个问题.
有没有人有任何想法?
编辑
如果我使用NSSet设置我的NSDictionary参数,找到一半解决方案:
[self.parameters setObject:[NSSet setWithObjects:@"12345",@"2345", nil] forKey:@"IncludedUserIds"];
Run Code Online (Sandbox Code Playgroud)
这是我需要的.不过我有一个跟进问题:
需要将值动态添加到NSSet中 - 如何创建可在运行时接受额外值的NSSet?
我有一个UITabBarController我正在开发的基础应用程序.在我的屏幕设计之一,我需要隐藏标签栏(我做UIView的setHidden方法),那么我放在一个UIView,其中tabBar通常会并添加一个UIButton到UIView.但是,当点击按钮时,我没有得到任何回应.该按钮不会收到任何触摸事件.
我已经查看了解决方案的一些问题和答案.但是大多数都需要子类化.我已经尝试了子类化并重写了HitTest事件,但是即使在我的UIButton子类中也没有调用该方法.
我正在开发iOS 7.1.
任何人都可以对此有所了解,以及如何让按钮响应触摸事件?
编辑
我的自己和@Geet更仔细地研究了这个问题.似乎任何东西放置在与UITabBar不接收触摸事件相同的空间中.作为测试,我创建了一个新项目,其中包含很少的代码,可以复制我原来的项目设置.
在示例应用程序中,我们在第一个选项卡中UIViewController嵌入了一个UITabBarController.这UIViewController是再嵌入一个UINavigationController.从那里,我们将第二个UIViewController推入堆栈.
点击顶部的"隐藏标签栏"按钮即可.隐藏tabBar.它暴露了UIView放置在那里的绿色storyboard,其中一个UIButton连接到ViewControllers实现文件.此按钮根本不会接收任何触摸事件.只要我将按钮移动到TabBar通常占据的空间上方,按钮就会起作用.将其向下移回屏幕底部 - 按钮不再起作用.
似乎苹果已禁止所有触摸事件UITabBar.我想知道这有什么办法吗?
我试过了:
self.tabbar.userInteractionENabled = NO;
Run Code Online (Sandbox Code Playgroud)
这也没有帮助.
也许有一种方法,我们能够覆盖在子类中UITabbarController,当UITabBar隐藏时,允许触摸此规范?
如果有人想要使用示例项目 - 它在我的gitHub上:
我正在探索新的 Android 架构组件,并希望将其实现到 Android 应用程序中。我对 MVVM 很坚定,因为我在 iOS 开发中使用了该范例。阅读 Google 提供的 Android 架构组件指南: https: //developer.android.com/topic/libraries/architecture/guide.html
我只有几个问题...
在上面提到的指南中,Google 使用访问这些 Web 服务 API 的类 -如果应用程序上只有一个屏幕需要来自 REST API 的数据,那么UserRepository他们继续将此类设为 a ,这可能没问题。Singleton
我关心的是这个;谷歌似乎主张需要在每个 ViewModel 的基础上创建一个存储库类。这对我来说听起来很错误,因为Singlton应用程序中有这么多课程。如果我们有 10 个屏幕,有 10 个 ViewModel(每个视图模型都需要自己的Repository module),那么我们的应用程序中就会有 10 个单例。从 iOS 开发者的角度来看,有这么多是错误的。
解决此问题的方法是使用一个中介器(存储库)类,该类具有公共方法,公开 API 以从 REST API 获取数据。Web 服务部分将位于其自己的类中。这样,我们就可以很好地分离关注点。
每个 ViewModel 有一个存储库类,还是每个应用程序有一个存储库类,这是最佳实践吗?我对此不是100%确定。
最后,我也有同样的担忧Room- Google 是说我们在每个 ViewModel 基础上创建一个数据库还是每个应用程序创建一个数据库?
我有一个在生产中运行良好的应用程序。但是,由于iOS 11-我收到此错误:
任务<51E07EF5-6F31-4E58-8818-7712CB3E49A6>。<20> HTTP加载失败(错误代码:-999 [1:89])任务<51E07EF5-6F31-4E58-8818-7712CB3E49A6>。错误完成-代码:-999
仅在iOS 11上会发生这种情况。另外,它也不是一致的。对同一URL的五个请求中,有两个将因此失败。在蜂窝连接上,它发生的频率较低,但仍然存在。
我正在使用AFNetworking,正如所说;直到iOS11,这才成为问题。
有任何想法吗?
更新以添加更多详细信息:
我正在使用带有有效证书的SSL固定。我的info.plist看起来像这样:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>url.com</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
Run Code Online (Sandbox Code Playgroud)
像这样使用SSL固定:
NSString *pathToProdCert = [[NSBundle mainBundle]pathForResource:@"MY_CERT" ofType:@"cer"];
if(pathToProdCert){
manager.securityPolicy.pinnedCertificates = [NSSet setWithObjects[NSData dataWithContentsOfFile:pathToProdCert], nil];
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
}
Run Code Online (Sandbox Code Playgroud)
更新: 针对评论:这是管理器的声明方式:
@property (nonatomic) AFHTTPSessionManager *manager;
Run Code Online (Sandbox Code Playgroud)
通过我的Web服务类的init方法初始化管理器:
-(instancetype)initWithBaseUrl:(NSURL *)url {
self = [super init];
if (self){
self.manager = [[AFHTTPSessionManager alloc] initWithBaseURL:url];
self.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
每个应用会话仅初始化一次。
更新:
根据要求,这是userInfo里面的error …
是否有可能有一个NSString字体大小/颜色的第一个字和下一个字体的另一种字体大小和颜色?
我想也许NSAttributedString- 但不确定那是不是这样的路?
我尝试将两个NSString放入NSAttributedString- 但这不起作用.
寻找具有以下内容的UILabel:
LARGEString(smallString)
工作实例
到目前为止,我已经想出了这个:
/* Set the Font Sizes */
UIFont *objectNameFont = [UIFont systemFontOfSize:14.f];
UIFont *itemsFont = [UIFont systemFontOfSize:12.f];
/* Create the attribute dictionaries */
NSDictionary *objectNameDict = [NSDictionary dictionaryWithObject:objectNameFont forKey:NSFontAttributeName];
NSDictionary *objectItemDict = [NSDictionary dictionaryWithObject:itemsFont forKey:NSFontAttributeName];
/* Create the string */
NSString *labelFullName = [NSString stringWithFormat:@"%@ (%@)", object.name, object.items];
/* Seperate the two strings */
NSArray *components = [labelFullName componentsSeparatedByString:@" ("];
NSRange objectNameRange = [labelFullName …Run Code Online (Sandbox Code Playgroud) ios ×9
objective-c ×8
iphone ×3
afnetworking ×1
android ×1
android-architecture-components ×1
android-room ×1
firebase ×1
ios11 ×1
mvvm ×1
nsstring ×1
uibutton ×1
uiview ×1