- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我似乎在我的应用程序中设置委托(delegate)时遇到了一些困难。我认为这部分是因为它是一个 UIPageView。
在我的 DetailPage(UIPageViewController)中
#import "PhotoViewController.h"
@interface DetailPageController : UIPageViewController <UIPageViewControllerDelegate, PhotoViewControllerDelegate>
@property (nonatomic, strong) PhotoViewController *photoViewController;
@end
在 .m 中
#import "DetailPageController.h"
#import "DetailPageModelController.h"
@interface DetailPageController ()
@end
- (void)viewDidLoad
{
[super viewDidLoad];
self.modelController.photos = self.photos;
UIViewController *initialController = (UIViewController *)[self.modelController viewControllerAtIndex:self.initialIndex storyboard:self.storyboard];
self.delegate = self;
[self setViewControllers:@[initialController]
direction:UIPageViewControllerNavigationDirectionForward
animated:NO
completion:^(BOOL finished) {
}];
}
- (void)photoCall
{
NSLog(@"called from photoCall");
}
@end
我正在设置基于模态的页面 View ,我可以设置 View Controller 并且它显示正常。但我不知道在哪里设置我的委托(delegate)?我从不在任何地方分配 View Controller (PhotoViewController)。
模态 Controller .m:
#import "DetailPageModelController.h"
#import "PhotoViewController.h"
#import "Media.h"
@implementation DetailPageModelController
- (UIImage *)photoAtIndex:(NSUInteger)index {
if ([self.photos count] == 0 || index >=[self.photos count]) {
return nil;
}
Media *object = [[Media alloc] init];
object = self.photos[index];
ALAssetRepresentation *rep = [object.asset defaultRepresentation];
CGImageRef iref = [rep fullResolutionImage];
UIImage *image = [UIImage imageWithCGImage:iref];
return image;
}
#pragma mark - convenience methods
- (PhotoViewController *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard
{
UIImage *photo = [self photoAtIndex:index];
if (photo == nil) {
return nil;
}
//No segue, load manually
PhotoViewController *controller = [storyboard instantiateViewControllerWithIdentifier:@"PhotoViewController"];
controller.photo = photo;
controller.num = index;
return controller;
}
- (NSUInteger)indexOfViewController:(PhotoViewController *)controller
{
//Returns the position in array of photos that current picture is
//Same as current view controller
return controller.num;
}
#pragma mark - page view data source
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
NSUInteger index = [self indexOfViewController:(PhotoViewController *) viewController];
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
NSUInteger index = [self indexOfViewController:(PhotoViewController *) viewController];
if (index == NSNotFound) {
return nil;
}
index++;
if (index == [self.photos count]) {
return nil;
}
return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}
那么实际的page view有如下代码:
PhotoViewController.h
@protocol PhotoViewControllerDelegate <NSObject>
- (void)photoCall;
@end
@interface PhotoViewController : UIViewController
@property (nonatomic, strong) UIImage *photo;
//storyboard
@property (nonatomic, strong) IBOutlet UIImageView *imageView;
@property (nonatomic, strong) id<PhotoViewControllerDelegate> photoViewControllerDelegate;
@end
.m:
#import "PhotoViewController.h"
@interface PhotoViewController ()
@end
@implementation PhotoViewController
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
[self setPhotoView];
}
- (void)setPhotoView
{
[self.imageView setImage: _photo];
self.imageView.frame = [[UIScreen mainScreen] bounds];
}
- (void)callingHome
{
NSLog(@"tcd called");
[_photoViewControllerDelegate photoCall];
}
@end
callingHome 方法在按下按钮时被调用,我只是想找到设置此委托(delegate)的位置。
我认为它应该像这样工作:
按下按钮 -> callingHome 被调用调用 callingHome -> _photoViewControllerDelegate 在我的主 UIPageView Controller 中调用方法 photoCall
它记录到控制台,我们完成了!
最佳答案
替换这些行:
UIViewController *initialController = (UIViewController *)[self.modelController viewControllerAtIndex:self.initialIndex storyboard:self.storyboard];
self.delegate = self;
与
PhotoViewController *initialController = [self.modelController viewControllerAtIndex:self.initialIndex storyboard:self.storyboard];
initialController.delegate = self;
在您的应用程序的其余部分,每当您实例化一个 PhotoViewController
以由 DetailPageController
实例管理时,确保将页面 Controller 设置为照片 View Controller 。例如,更改您的 UIPageViewControllerDataSource
方法,如下所示:
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
NSUInteger index = [self indexOfViewController:(PhotoViewController *) viewController];
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
PhotoViewController *photoVC = [self viewControllerAtIndex:index storyboard:viewController.storyboard];
if ([pageViewController conformsToProtocol:@protocol(PhotoViewControllerDelegate)]) {
photoVC.delegate = (id<PhotoViewControllerDelegate>)pageViewController;
}
return photoVC;
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
NSUInteger index = [self indexOfViewController:(PhotoViewController *) viewController];
if (index == NSNotFound) {
return nil;
}
index++;
if (index == [self.photos count]) {
return nil;
}
PhotoViewController *photoVC = [self viewControllerAtIndex:index storyboard:viewController.storyboard];
if ([pageViewController conformsToProtocol:@protocol(PhotoViewControllerDelegate)]) {
photoVC.delegate = (id<PhotoViewControllerDelegate>)pageViewController;
}
return photoVC;
}
或者修改您的 viewControllerAtIndex:storyboard:
方法以获取委托(delegate)参数并在那里进行分配。然而对您来说很方便 - 只要确保在您创建这些委托(delegate)时分配这些委托(delegate)以进入您的页面即可。
关于ios - 正确设置委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18199456/
我看了很多文章,但我仍然不清楚我们通常创建的普通委托(delegate)和多播委托(delegate)之间的区别。 public delegate void MyMethodHandler(objec
考虑以下几点: Action a1 = new Action(_insert); Action a2 = new Action(a1); a2 指的是什么?它是 a1,a1 的浅拷贝还是 a1 的深拷
我希望这听起来像是一个显而易见的问题,但是委托(delegate)返回类型是否也必须与其委托(delegate)的方法的返回类型相匹配? EG,像这样: public static void Save
我想使用 Kotlin 委托(delegate),但我不想在委托(delegate)人之外创建委托(delegate)。委托(delegate)的所有示例都如下所示: interface Worker
class SuperClass { var delegate : SuperClassDelegate? } protocol SuperClassDelegate { func d
我有一个加载 View 的 View ,需要将 View 推送到主导航 Controller 。 我已经为每个 View 设置了一个委托(delegate),并且基本上使我的调用沿着“链”返回到主导航
为简单起见,假设我想创建一个自定义 UITextField 并向其添加一个简单的行为;也就是说,如果文本字段成为第一响应者,背景颜色将变为绿色。 为此,在我的自定义类中,我必须将该类设置为委托(del
我非常有信心我应该能够使用非静态方法的委托(delegate),但下面给了我一个错误: public class TestClass { private delegate void TestD
在 C# 中不能从 System.Delegate 或 System.MulticastDelegate 继承。只要您声明标准的“运行时托管”方法,就完全可以在 MSIL 中执行此操作。但是,每次我向
我在 Storyboard 中定义了一个 iPad 界面,带有一个 SplitViewController。我想将 SplitViewController 的委托(delegate)设置为指向详细 C
我有几个解析器。有一个顶级的可以委托(delegate)给另一个。 Parser我们从 Reader 中获取他们的输入(可变)。我只想要一个 Parser为了能够一次解析,只有一个解析器应该有 Rea
一直以来我都在阅读关于反射的文章,每个人都在说:“反射很慢”,“反射很慢”。 现在我决定测试速度有多慢,令我惊讶的是,使用反射创建的委托(delegate)实际上是使用 lambda 创建的委托(de
在 Xcode 4.5 中启动了 Cocos2D 2.1 模板(没有物理引擎),针对 iOS 6 和 iPad。在 CDAudioManager.m 文件中,以下代码... AVAudioSessio
以下是来自未管理的 dll 的函数代码。它接受一个函数指针作为参数,并简单地返回被调用函数返回的值。 extern __declspec(dllexport) int _stdcall callDe
//NewCharts.h #import @interface NewCharts : UIViewController @property(nonatomic,retain)IBOutlet U
鉴于以下 MSDN 示例代码,为什么我不能定义 Action 委托(delegate)“内联”: public static void Main(string[] args) { Action
在虚幻引擎中,UFUNCTION用于通过附加说明符来丰富功能,以用于蓝图使用、复制和委托(delegate)。 然而,一些委托(delegate)类型似乎不允许绑定(bind) UFUNCTION(如
我刚刚将照片选择器放入我的项目中,一切正常。唯一的事情是它坚持在我设置委托(delegate)的地方给我以下警告 - Assigning to 'id' from incompatible type
我有一个 UIImageView 的子类,并且想将 self 作为参数传递给委托(delegate)。我在 MyImageView 之前收到错误“预期 ')'”。我需要将对象传递给委托(delegat
我正在开发 iOS 10 的语音转文本功能。 我希望调用 SFSpeechRecognitionTaskDelegate 的委托(delegate)方法来检查完成的结果。 func speechRec
我是一名优秀的程序员,十分优秀!